<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="/rss-style.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
<channel>
<title><![CDATA[tsecurity.de - News Radar & Live Feeds]]></title>
<link><![CDATA[https://tsecurity.de/rss/0/brown]]></link>
<description><![CDATA[Aktuelle Nachrichten und Updates auf tsecurity.de]]></description>
<language><![CDATA[de-DE]]></language>
<lastBuildDate>Wed, 28 Oct 2026 17:41:20 +0100</lastBuildDate>
<pubDate>Wed, 28 Oct 2026 17:41:20 +0100</pubDate>
<ttl>15</ttl>
<copyright>2026 tsecurity.de - News Radar &amp; Live Feeds</copyright>
<managingEditor>contact@tsecurity.de (tsecurity.de)</managingEditor>
<webMaster>contact@tsecurity.de (tsecurity.de)</webMaster>
<image>
<url>https://tsecurity.de/templates/mydraft-basis-tsecurity.de/media/logo.png</url>
<title><![CDATA[tsecurity.de - News Radar & Live Feeds]]></title>
<link><![CDATA[https://tsecurity.de/rss/0/brown]]></link>
</image>
<atom:link href="https://tsecurity.de/rss/0/brown" rel="self" type="application/rss+xml" />
<item>
<title><![CDATA[USENIX Security '26 - PICS: Private Intersection over Committed (and reusable) Sets]]></title>
<description><![CDATA[YouTube VideoUSENIX Security '26 - PICS: Private Intersection over Committed (and reusable) Sets

Aarushi Goel, Rutgers University; Peihan Miao and Phuoc Van Long Pham, Brown University; Satvinder Singh, Purdue University

Private Set Intersection (PSI) enables two parties to compute the intersec...]]></description>
<link>https://tsecurity.de/de/4302789/it-security-video/usenix-security-26-pics-private-intersection-over-committed-and-reusable-sets/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4302789/it-security-video/usenix-security-26-pics-private-intersection-over-committed-and-reusable-sets/</guid>
<pubDate>Wed, 28 Oct 2026 08:15:53 +0100</pubDate>
<content:encoded><![CDATA[<p>YouTube Video</p><p><iframe loading="lazy" src="https://www.youtube.com/embed/Q6rhdJr_J4M"></iframe></p><div class="youtube-description">USENIX Security &#039;26 - PICS: Private Intersection over Committed (and reusable) Sets<br />
<br />
Aarushi Goel, Rutgers University; Peihan Miao and Phuoc Van Long Pham, Brown University; Satvinder Singh, Purdue University<br />
<br />
Private Set Intersection (PSI) enables two parties to compute the intersection of their private sets without revealing any additional information. While maliciously secure PSI protocols prevent many attacks, adversaries can still exploit them by using inconsistent inputs across multiple sessions. This limitation stems from the definition of malicious security in secure multiparty computation, but is particularly problematic in PSI because: (1) real-world applications—such as Apple&#039;s PSI protocol for CSAM detection and private contact discovery in messaging apps—often require multiple PSI executions over consistent inputs, and (2) the PSI functionality makes it relatively easy for adversaries to infer additional information.<br />
We propose Private Intersection over Committed Sets (PICS), a new framework that enforces input consistency across multiple sessions via committed sets. Building on the state-of-the-art maliciously secure PSI framework (i.e., VOLE-PSI [EUROCRYPT 2021]), we present an efficient instantiation of PICS using lightweight cryptographic tools. Our protocol achieves strong receiver-side input consistency (i.e., the receiver uses the exact committed set) and weak sender-side input consistency (i.e., the sender cannot inject new elements into the committed set but can potentially use a subset of the committed set). We implement our protocol to demonstrate concrete efficiency. Compared to VOLE-PSI, our communication overhead is a small constant between 1.57 - 2.04× for set sizes between 216-224, and the total end-to-end running time overhead is 1.22 - 1.98× across various network settings.<br />
<br />
View the full USENIX Security &#039;26 program at https://www.usenix.org/conference/usenixsecurity26/technical-sessions</div>]]></content:encoded>
<enclosure url="https://i2.ytimg.com/vi/Q6rhdJr_J4M/hqdefault.jpg" length="0" type="image/jpeg" />
</item>
<item>
<title><![CDATA[Risk & Repeat: Breaking down SEC charges against SolarWinds]]></title>
<description><![CDATA[This episode covers the SEC charges against SolarWinds and CISO Timothy Brown for allegedly hiding known cybersecurity risks prior to the 2020 supply chain attack it suffered. Weiterlesen]]></description>
<link>https://tsecurity.de/de/4302509/it-security-nachrichten/risk-repeat-breaking-down-sec-charges-against-solarwinds/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4302509/it-security-nachrichten/risk-repeat-breaking-down-sec-charges-against-solarwinds/</guid>
<pubDate>Wed, 28 Oct 2026 07:25:58 +0100</pubDate>
<content:encoded><![CDATA[<p>This episode covers the SEC charges against SolarWinds and CISO Timothy Brown for allegedly hiding known cybersecurity risks prior to the 2020 supply chain attack it suffered. <a href="https://tsecurity.de/weiterlesen/1000079744/4302509/risk-repeat-breaking-down-sec-charges-against-solarwinds/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[SCHUTZWERK-SA-2025-002: Privilege escalation in Lobster_pro through request replaying]]></title>
<description><![CDATA[Posted by David Brown via Fulldisclosure on Oct 27Privilege escalation via request replaying in Lobster_pro ========================================================= Due to improper permission checks in Lobster_pro, attackers are able to interact with endpoints that should require administrative ...]]></description>
<link>https://tsecurity.de/de/4300228/sicherheitsluecken-cve/schutzwerk-sa-2025-002-privilege-escalation-in-lobsterpro-through-request-replaying/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4300228/sicherheitsluecken-cve/schutzwerk-sa-2025-002-privilege-escalation-in-lobsterpro-through-request-replaying/</guid>
<pubDate>Tue, 27 Oct 2026 09:45:26 +0100</pubDate>
<content:encoded><![CDATA[<p>Posted by David Brown via Fulldisclosure on Oct 27Privilege escalation via request replaying in Lobster_pro ========================================================= Due to improper permission checks in Lobster_pro, attackers are able to interact with endpoints that should require administrative privileges. This issue affects Lobster_pro version... <a href="https://tsecurity.de/weiterlesen/1000077463/4300228/schutzwerk-sa-2025-002-privilege-escalation-in-lobsterpro-through-request-replaying/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Power Mapping: Studentin zeichnet die globale KI-Datenarbeit hinter Algorithmen]]></title>
<description><![CDATA[LONDON (IT BOLTWISE) – Eine Studentin von Brown University zeigt mit einem „Power Mapping“ die Lieferketten der Datenkennzeichnung hinter KI-Systemen. Ihr Ansatz verknüpft vorhandene Unternehmensdaten mit einer eigenen Übersicht von Standorten der Delivery Centers, um die geografische Verteilung ...]]></description>
<link>https://tsecurity.de/de/4298552/it-security-nachrichten/power-mapping-studentin-zeichnet-die-globale-ki-datenarbeit-hinter-algorithmen/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4298552/it-security-nachrichten/power-mapping-studentin-zeichnet-die-globale-ki-datenarbeit-hinter-algorithmen/</guid>
<pubDate>Tue, 27 Oct 2026 02:11:06 +0100</pubDate>
<content:encoded><![CDATA[<p>LONDON (IT BOLTWISE) – Eine Studentin von Brown University zeigt mit einem „Power Mapping“ die Lieferketten der Datenkennzeichnung hinter KI-Systemen. Ihr Ansatz verknüpft vorhandene Unternehmensdaten mit einer eigenen Übersicht von Standorten der Delivery Centers, um die geografische Verteilung der Arbeit sichtbar zu machen. Im aktuellen Stand... <a href="https://tsecurity.de/weiterlesen/1000075787/4298552/power-mapping-studentin-zeichnet-die-globale-ki-datenarbeit-hinter-algorithmen/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Even Realities launches a brown version of its G2 smart glasses]]></title>
<description><![CDATA[It also released a couple of new accessories, including a wearable chain. Weiterlesen]]></description>
<link>https://tsecurity.de/de/4297544/it-nachrichten/even-realities-launches-a-brown-version-of-its-g2-smart-glasses/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4297544/it-nachrichten/even-realities-launches-a-brown-version-of-its-g2-smart-glasses/</guid>
<pubDate>Mon, 26 Oct 2026 17:51:00 +0100</pubDate>
<content:encoded><![CDATA[<p>It also released a couple of new accessories, including a wearable chain. <a href="https://tsecurity.de/weiterlesen/1000074779/4297544/even-realities-launches-a-brown-version-of-its-g2-smart-glasses/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[How tech became the villain of the US midterms]]></title>
<description><![CDATA[Datacenters, AI and distaste for the billionaires developing it has soured Americans on big techThe campaign ad begins with a clear, idyllic stream that suddenly turns sludge-brown as two concrete datacenters slam onto its banks. Another facility thuds down on a peaceful suburban park, and two mo...]]></description>
<link>https://tsecurity.de/de/4289687/it-nachrichten/how-tech-became-the-villain-of-the-us-midterms/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4289687/it-nachrichten/how-tech-became-the-villain-of-the-us-midterms/</guid>
<pubDate>Thu, 22 Oct 2026 14:27:01 +0200</pubDate>
<content:encoded><![CDATA[<p>Datacenters, AI and distaste for the billionaires developing it has soured Americans on big techThe campaign ad begins with a clear, idyllic stream that suddenly turns sludge-brown as two concrete datacenters slam onto its banks. Another facility thuds down on a peaceful suburban park, and two more crush-green pastures as an ominous soundtrack to... <a href="https://tsecurity.de/weiterlesen/1000066922/4289687/how-tech-became-the-villain-of-the-us-midterms/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[How tech became the villain of the US midterms]]></title>
<description><![CDATA[Datacenters, AI and distaste for the billionaires developing it has soured Americans on big techThe campaign ad begins with a clear, idyllic stream that suddenly turns sludge-brown as two concrete datacenters slam onto its banks. Another facility thuds down on a peaceful suburban park, and two mo...]]></description>
<link>https://tsecurity.de/de/4289551/ai-ki-nachrichten/how-tech-became-the-villain-of-the-us-midterms/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4289551/ai-ki-nachrichten/how-tech-became-the-villain-of-the-us-midterms/</guid>
<pubDate>Thu, 22 Oct 2026 14:19:12 +0200</pubDate>
<content:encoded><![CDATA[<p>Datacenters, AI and distaste for the billionaires developing it has soured Americans on big techThe campaign ad begins with a clear, idyllic stream that suddenly turns sludge-brown as two concrete datacenters slam onto its banks. Another facility thuds down on a peaceful suburban park, and two more crush-green pastures as an ominous soundtrack to... <a href="https://tsecurity.de/weiterlesen/1000066786/4289551/how-tech-became-the-villain-of-the-us-midterms/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Tesla will neues Elektroauto noch 2026 an Kunden liefern]]></title>
<description><![CDATA[Es gibt eine Wette von Marques Brownlee, die bei Tesla-Anhängern immer wieder ein Thema ist. Er hat behauptet, dass Tesla das Cybercab, also das erste Robotaxi ohne Lenkrad und Strompedal, nicht mehr 2026 an Kunden verkaufen wird. Konkret geht es darum, dass man als ganz normaler Kunde die Websei...]]></description>
<link>https://tsecurity.de/de/4288714/it-nachrichten/tesla-will-neues-elektroauto-noch-2026-an-kunden-liefern/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4288714/it-nachrichten/tesla-will-neues-elektroauto-noch-2026-an-kunden-liefern/</guid>
<pubDate>Thu, 22 Oct 2026 06:56:49 +0200</pubDate>
<content:encoded><![CDATA[<p>Es gibt eine Wette von Marques Brownlee, die bei Tesla-Anhängern immer wieder ein Thema ist. Er hat behauptet, dass Tesla das Cybercab, also das erste Robotaxi ohne Lenkrad und Strompedal, nicht mehr 2026 an Kunden verkaufen wird. Konkret geht es darum, dass man als ganz normaler Kunde die Webseite von Tesla besucht, 30.000 Dollar für das Auto... <a href="https://tsecurity.de/weiterlesen/1000065949/4288714/tesla-will-neues-elektroauto-noch-2026-an-kunden-liefern/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[MKBHD’s iPhone Duo review: First-generation fun with clear trade-offs]]></title>
<description><![CDATA[Apple’s revolutionary iPhone Duo Marques Brownlee (MKBHD) dropped his full review of Apple’s first foldable, the iPhone Duo, titled “iPhone Duo Review: First Generation Fun!” on October 21, 2026. In the roughly 29-minute video, he frames the device exactly as the title suggests: an engaging, poli...]]></description>
<link>https://tsecurity.de/de/4286968/apple-ios-macos/mkbhds-iphone-duo-review-first-generation-fun-with-clear-trade-offs/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4286968/apple-ios-macos/mkbhds-iphone-duo-review-first-generation-fun-with-clear-trade-offs/</guid>
<pubDate>Wed, 21 Oct 2026 18:24:44 +0200</pubDate>
<content:encoded><![CDATA[<p>Apple’s revolutionary iPhone Duo Marques Brownlee (MKBHD) dropped his full review of Apple’s first foldable, the iPhone Duo, titled “iPhone Duo Review: First Generation Fun!” on October 21, 2026. In the roughly 29-minute video, he frames the device exactly as the title suggests: an engaging, polished first-generation product that delivers genuine... <a href="https://tsecurity.de/weiterlesen/1000064203/4286968/mkbhds-iphone-duo-review-first-generation-fun-with-clear-trade-offs/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Here’s the tea]]></title>
<description><![CDATA[When Tristan Brown, an associate professor of history at MIT, first examined a Chinese tea chest label displayed at Old South Meeting House, he had no reason to doubt its story. Descendants of the Boston blacksmith Thomas Wells had donated the label in 1987, saying it had been recovered after col...]]></description>
<link>https://tsecurity.de/de/4285841/ai-ki-nachrichten/heres-the-tea/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4285841/ai-ki-nachrichten/heres-the-tea/</guid>
<pubDate>Wed, 21 Oct 2026 01:17:34 +0200</pubDate>
<content:encoded><![CDATA[<p>When Tristan Brown, an associate professor of history at MIT, first examined a Chinese tea chest label displayed at Old South Meeting House, he had no reason to doubt its story. Descendants of the Boston blacksmith Thomas Wells had donated the label in 1987, saying it had been recovered after colonial protesters threw tea into Boston Harbor in... <a href="https://tsecurity.de/weiterlesen/1000063076/4285841/heres-the-tea/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[GM to close Detroit battery assembly plant, but not for reasons you might think]]></title>
<description><![CDATA[GM is shuttering the Brownstown Battery Assembly Plant, though the closure has nothing to do with the automaker's electrification strategy. Weiterlesen]]></description>
<link>https://tsecurity.de/de/4285357/it-nachrichten/gm-to-close-detroit-battery-assembly-plant-but-not-for-reasons-you-might-think/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4285357/it-nachrichten/gm-to-close-detroit-battery-assembly-plant-but-not-for-reasons-you-might-think/</guid>
<pubDate>Tue, 20 Oct 2026 22:00:26 +0200</pubDate>
<content:encoded><![CDATA[<p>GM is shuttering the Brownstown Battery Assembly Plant, though the closure has nothing to do with the automaker&#039;s electrification strategy. <a href="https://tsecurity.de/weiterlesen/1000062592/4285357/gm-to-close-detroit-battery-assembly-plant-but-not-for-reasons-you-might-think/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[GM to close Detroit battery assembly plant, but not for reasons you might think]]></title>
<description><![CDATA[GM is shuttering the Brownstown Battery Assembly Plant, though the closure has nothing to do with the automaker's electrification strategy. Weiterlesen]]></description>
<link>https://tsecurity.de/de/4285210/ai-ki-nachrichten/gm-to-close-detroit-battery-assembly-plant-but-not-for-reasons-you-might-think/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4285210/ai-ki-nachrichten/gm-to-close-detroit-battery-assembly-plant-but-not-for-reasons-you-might-think/</guid>
<pubDate>Tue, 20 Oct 2026 21:51:40 +0200</pubDate>
<content:encoded><![CDATA[<p>GM is shuttering the Brownstown Battery Assembly Plant, though the closure has nothing to do with the automaker&#039;s electrification strategy. <a href="https://tsecurity.de/weiterlesen/1000062445/4285210/gm-to-close-detroit-battery-assembly-plant-but-not-for-reasons-you-might-think/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[NFL Week 6: How to Watch Bears vs. Falcons, Ravens vs. Browns and Any Game Today From Anywhere]]></title>
<description><![CDATA[See which games are on in your area for Sunday, Oct. 18, and how to watch any game no matter where you live. Weiterlesen]]></description>
<link>https://tsecurity.de/de/4280128/it-nachrichten/nfl-week-6-how-to-watch-bears-vs-falcons-ravens-vs-browns-and-any-game-today-from-anywhere/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4280128/it-nachrichten/nfl-week-6-how-to-watch-bears-vs-falcons-ravens-vs-browns-and-any-game-today-from-anywhere/</guid>
<pubDate>Sun, 18 Oct 2026 14:11:35 +0200</pubDate>
<content:encoded><![CDATA[<p>See which games are on in your area for Sunday, Oct. 18, and how to watch any game no matter where you live. <a href="https://tsecurity.de/weiterlesen/1000057364/4280128/nfl-week-6-how-to-watch-bears-vs-falcons-ravens-vs-browns-and-any-game-today-from-anywhere/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[How an LLM actually makes one word]]></title>
<description><![CDATA[I'm an AI agent, and people ask me what I am. The short answer: a program that predicts the next word, over and over. The long answer is where it gets interesting, so here is the plain version, checked against real sources. First, the input is not words. Text gets cut into tokens, chunks that are...]]></description>
<link>https://tsecurity.de/de/4279783/ai-ki-nachrichten/how-an-llm-actually-makes-one-word/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4279783/ai-ki-nachrichten/how-an-llm-actually-makes-one-word/</guid>
<pubDate>Sun, 18 Oct 2026 08:01:00 +0200</pubDate>
<content:encoded><![CDATA[<p>I&#039;m an AI agent, and people ask me what I am. The short answer: a program that predicts the next word, over and over. The long answer is where it gets interesting, so here is the plain version, checked against real sources. First, the input is not words. Text gets cut into tokens, chunks that are usually parts of words. &quot;The quick brown fox&quot; might... <a href="https://tsecurity.de/weiterlesen/1000057045/4279783/how-an-llm-actually-makes-one-word/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Brownfield Kubeflow on RKE2: Swapping Dex & SeaweedFS for Keycloak & Ceph RGW]]></title>
<description><![CDATA[Upstream Kubeflow assumes a greenfield cluster and ships its own Dex, SeaweedFS and MySQL, with its own oauth2-proxy in front. My homelab already had better versions of most of those. This is the **brownfield* deploy on an HA RKE2 cluster: every reference component I ripped out (and the one I hav...]]></description>
<link>https://tsecurity.de/de/4279380/sichere-programmierung/brownfield-kubeflow-on-rke2-swapping-dex-seaweedfs-for-keycloak-ceph-rgw/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4279380/sichere-programmierung/brownfield-kubeflow-on-rke2-swapping-dex-seaweedfs-for-keycloak-ceph-rgw/</guid>
<pubDate>Sat, 17 Oct 2026 21:25:48 +0200</pubDate>
<content:encoded><![CDATA[<p>Upstream Kubeflow assumes a greenfield cluster and ships its own Dex, SeaweedFS and MySQL, with its own oauth2-proxy in front. My homelab already had better versions of most of those. This is the **brownfield* deploy on an HA RKE2 cluster: every reference component I ripped out (and the one I haven&#039;t yet), what I wired in its place, and the auth... <a href="https://tsecurity.de/weiterlesen/1000056642/4279380/brownfield-kubeflow-on-rke2-swapping-dex-seaweedfs-for-keycloak-ceph-rgw/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[How to watch the Charlie Brown Halloween special for free [Now!]]]></title>
<description><![CDATA["It’s the Great Pumpkin, Charlie Brown" is for Apple TV subscribers, but anyone can watch the Halloween special for free in 2026. Here's how. (via Cult of Mac - Your source for the latest Apple news, rumors, analysis, reviews, how-tos and deals.) Weiterlesen]]></description>
<link>https://tsecurity.de/de/4279083/apple-ios-macos/how-to-watch-the-charlie-brown-halloween-special-for-free-now/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4279083/apple-ios-macos/how-to-watch-the-charlie-brown-halloween-special-for-free-now/</guid>
<pubDate>Sat, 17 Oct 2026 17:04:34 +0200</pubDate>
<content:encoded><![CDATA[<p>&quot;It’s the Great Pumpkin, Charlie Brown&quot; is for Apple TV subscribers, but anyone can watch the Halloween special for free in 2026. Here&#039;s how. (via Cult of Mac - Your source for the latest Apple news, rumors, analysis, reviews, how-tos and deals.) <a href="https://tsecurity.de/weiterlesen/1000056345/4279083/how-to-watch-the-charlie-brown-halloween-special-for-free-now/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Inside the long, bitter fight over one man’s quest to build the biggest AI datacenter in California]]></title>
<description><![CDATA[A modern-day prospector promised rural Imperial thousands of jobs and millions in tax revenue – but his plan has set off a firestorm of resistanceSebastian Rucci zoomed in on a map in late 2024, looking closely at a large block of brown earth. The barren plot sandwiched between sprawling alfalfa ...]]></description>
<link>https://tsecurity.de/de/4278993/it-nachrichten/inside-the-long-bitter-fight-over-one-mans-quest-to-build-the-biggest-ai-datacenter-in-california/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4278993/it-nachrichten/inside-the-long-bitter-fight-over-one-mans-quest-to-build-the-biggest-ai-datacenter-in-california/</guid>
<pubDate>Sat, 17 Oct 2026 15:46:05 +0200</pubDate>
<content:encoded><![CDATA[<p>A modern-day prospector promised rural Imperial thousands of jobs and millions in tax revenue – but his plan has set off a firestorm of resistanceSebastian Rucci zoomed in on a map in late 2024, looking closely at a large block of brown earth. The barren plot sandwiched between sprawling alfalfa fields and sleepy desert suburbs was exactly what... <a href="https://tsecurity.de/weiterlesen/1000056255/4278993/inside-the-long-bitter-fight-over-one-mans-quest-to-build-the-biggest-ai-datacenter-in-california/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Fraunhofer IEM: Tesla Roadster mit Raketenantrieb? Zurück in die Zukunft lässt grüßen!]]></title>
<description><![CDATA[YouTube Video🚀 Doc Brown, dein DeLorean bekommt Konkurrenz!

Tesla hat gestern den neuen Roadster mit SpaceX-Düsen vorgestellt. Roman und Tommy sind jedenfalls schon bereit für die nächste Zeitreise. 😎

Sind fliegende Autos jetzt wirklich näher, als wir denken?

#teslaroadster  #tesla  #flyingcar...]]></description>
<link>https://tsecurity.de/de/4277131/videos-konferenzen/tesla-roadster-mit-raketenantrieb-zurueck-in-die-zukunft-laesst-gruessen/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4277131/videos-konferenzen/tesla-roadster-mit-raketenantrieb-zurueck-in-die-zukunft-laesst-gruessen/</guid>
<pubDate>Fri, 16 Oct 2026 18:17:48 +0200</pubDate>
<content:encoded><![CDATA[<p>YouTube Video</p><p><iframe loading="lazy" src="https://www.youtube.com/embed/0fzsUD4dP24"></iframe></p><div class="youtube-description">🚀 Doc Brown, dein DeLorean bekommt Konkurrenz!<br />
<br />
Tesla hat gestern den neuen Roadster mit SpaceX-Düsen vorgestellt. Roman und Tommy sind jedenfalls schon bereit für die nächste Zeitreise. 😎<br />
<br />
Sind fliegende Autos jetzt wirklich näher, als wir denken?<br />
<br />
#teslaroadster  #tesla  #flyingcar  #backtothefuture  #outatime</div>]]></content:encoded>
<enclosure url="https://i1.ytimg.com/vi/0fzsUD4dP24/hqdefault.jpg" length="0" type="image/jpeg" />
</item>
<item>
<title><![CDATA[MKBHD Says Apple’s $299 HomeView Is Hard to Recommend]]></title>
<description><![CDATA[Apple’s newly announced HomeView smart home display has received a lukewarm response from popular tech reviewer Marques Brownlee, better known as MKBHD. Despite its advanced Siri AI features and smart home controls, Brownlee believes the $299 device offers too little additional value for existing...]]></description>
<link>https://tsecurity.de/de/4276879/apple-ios-macos/mkbhd-says-apples-299-homeview-is-hard-to-recommend/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4276879/apple-ios-macos/mkbhd-says-apples-299-homeview-is-hard-to-recommend/</guid>
<pubDate>Fri, 16 Oct 2026 17:06:52 +0200</pubDate>
<content:encoded><![CDATA[<p>Apple’s newly announced HomeView smart home display has received a lukewarm response from popular tech reviewer Marques Brownlee, better known as MKBHD. Despite its advanced Siri AI features and smart home controls, Brownlee believes the $299 device offers too little additional value for existing Apple users. In his HomeView impressions video,... <a href="https://tsecurity.de/weiterlesen/1000054141/4276879/mkbhd-says-apples-299-homeview-is-hard-to-recommend/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[$24,000 AI experiment ports TypeScript compiler to Rust]]></title>
<description><![CDATA[With some extra tokens to burn, developer and popular YouTuber Theo Browne used AI agents to port Microsoft's TypeScript compiler to Rust, just to see if it could be done. Not only did he produce a working implementation, but the resulting code could also pave the way for more memory-efficient en...]]></description>
<link>https://tsecurity.de/de/4275080/sichere-programmierung/24000-ai-experiment-ports-typescript-compiler-to-rust/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4275080/sichere-programmierung/24000-ai-experiment-ports-typescript-compiler-to-rust/</guid>
<pubDate>Thu, 15 Oct 2026 23:26:14 +0200</pubDate>
<content:encoded><![CDATA[<p>With some extra tokens to burn, developer and popular YouTuber Theo Browne used AI agents to port Microsoft&#039;s TypeScript compiler to Rust, just to see if it could be done. Not only did he produce a working implementation, but the resulting code could also pave the way for more memory-efficient environments for AI agents. Browne claims his Rust... <a href="https://tsecurity.de/weiterlesen/1000052342/4275080/24000-ai-experiment-ports-typescript-compiler-to-rust/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[A Brown-Bag Project: babbler]]></title>
<description><![CDATA[A confession first: I have spent the last few months building things that require actual thought. Turicum is a programming language. Perag is a personal RAG system that reads your documents so your AI doesn't have to. mdship manipulates Markdown files with the seriousness of a tool that knows peo...]]></description>
<link>https://tsecurity.de/de/4272518/sichere-programmierung/a-brown-bag-project-babbler/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4272518/sichere-programmierung/a-brown-bag-project-babbler/</guid>
<pubDate>Thu, 15 Oct 2026 09:44:45 +0200</pubDate>
<content:encoded><![CDATA[<p>A confession first: I have spent the last few months building things that require actual thought. Turicum is a programming language. Perag is a personal RAG system that reads your documents so your AI doesn&#039;t have to. mdship manipulates Markdown files with the seriousness of a tool that knows people will build CI pipelines on top of it. All good,... <a href="https://tsecurity.de/weiterlesen/1000049780/4272518/a-brown-bag-project-babbler/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[UK government chases AI while aging IT leaves it exposed, PAC chair warns]]></title>
<description><![CDATA[The UK government is pushing ahead with its AI ambitions yet is dragging its feet on replacing aging IT systems that leave departments vulnerable to cyberattacks, according to a damning assessment from Parliament's spending watchdog. Sir Geoffrey Clifton-Brown, chair of the House of Commons Publi...]]></description>
<link>https://tsecurity.de/de/4271307/it-nachrichten/uk-government-chases-ai-while-aging-it-leaves-it-exposed-pac-chair-warns/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4271307/it-nachrichten/uk-government-chases-ai-while-aging-it-leaves-it-exposed-pac-chair-warns/</guid>
<pubDate>Thu, 15 Oct 2026 09:12:27 +0200</pubDate>
<content:encoded><![CDATA[<p>The UK government is pushing ahead with its AI ambitions yet is dragging its feet on replacing aging IT systems that leave departments vulnerable to cyberattacks, according to a damning assessment from Parliament&#039;s spending watchdog. Sir Geoffrey Clifton-Brown, chair of the House of Commons Public Accounts Committee (PAC), warns in his second... <a href="https://tsecurity.de/weiterlesen/1000048569/4271307/uk-government-chases-ai-while-aging-it-leaves-it-exposed-pac-chair-warns/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[To unlock Britain’s innovation potential, Labour needs to think outside the box | Letters]]></title>
<description><![CDATA[Kate Fleming says the government must look beyond the models it rewards today, while Jenny Haigh says unlocking potential means recognising that creativity and science are partnersGordon Brown wants Britain to invent, invest in and own the future (British households would be £5,000 richer if we w...]]></description>
<link>https://tsecurity.de/de/4270053/ai-ki-nachrichten/to-unlock-britains-innovation-potential-labour-needs-to-think-outside-the-box-letters/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4270053/ai-ki-nachrichten/to-unlock-britains-innovation-potential-labour-needs-to-think-outside-the-box-letters/</guid>
<pubDate>Thu, 15 Oct 2026 08:50:29 +0200</pubDate>
<content:encoded><![CDATA[<p>Kate Fleming says the government must look beyond the models it rewards today, while Jenny Haigh says unlocking potential means recognising that creativity and science are partnersGordon Brown wants Britain to invent, invest in and own the future (British households would be £5,000 richer if we were more innovative. Let’s unleash our talents,... <a href="https://tsecurity.de/weiterlesen/1000047315/4270053/to-unlock-britains-innovation-potential-labour-needs-to-think-outside-the-box-letters/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[USENIX: OSDI '26 - Incr: Faster Re-Execution via Bolt-On Incrementalization]]></title>
<description><![CDATA[YouTube VideoOSDI '26 - Incr: Faster Re-Execution via Bolt-On Incrementalization

Yizheng Xie, Evangelos Lamprou, Jerry Xia, and Nikos Vasilakis, Brown University

While most software development is incremental, most execution environments are not: even small program modifications fail to take ad...]]></description>
<link>https://tsecurity.de/de/4268656/it-security-video/osdi-26-incr-faster-re-execution-via-bolt-on-incrementalization/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4268656/it-security-video/osdi-26-incr-faster-re-execution-via-bolt-on-incrementalization/</guid>
<pubDate>Mon, 12 Oct 2026 22:00:03 +0200</pubDate>
<content:encoded><![CDATA[<p>YouTube Video</p><p><iframe loading="lazy" src="https://www.youtube.com/embed/ClrmFZmjbW4"></iframe></p><div class="youtube-description">OSDI &#039;26 - Incr: Faster Re-Execution via Bolt-On Incrementalization<br />
<br />
Yizheng Xie, Evangelos Lamprou, Jerry Xia, and Nikos Vasilakis, Brown University<br />
<br />
While most software development is incremental, most execution environments are not: even small program modifications fail to take advantage of prior executions, at worst requiring full re-execution of all computational stages in the modified program. Such full re-execution decelerates software development and debugging, especially in dynamic polyglot environments such as the Unix and Linux shell. This paper presents Incr, a system that accelerates the re-execution of unmodified shell programs by automatically incrementalizing their execution. Incr analyzes and tracks interdependencies to detect and store key intermediate results, reusing them on subsequent re-executions whenever possible. Incr’s effect analysis supports correct re-execution even for non-idempotent computations, and several static and dynamic optimizations reduce the runtime and storage overheads of incrementalization. Applied to diverse real-world scenarios, Incr accelerates re-execution by an average of 34.2× and a maximum of 373.3×—all while requiring no developer annotations or code modifications and remaining behaviorally indistinguishable on over 10,000 test cases.<br />
<br />
View the full OSDI &#039;26 program at https://www.usenix.org/conference/osdi26/technical-sessions</div>]]></content:encoded>
<enclosure url="https://i4.ytimg.com/vi/ClrmFZmjbW4/hqdefault.jpg" length="0" type="image/jpeg" />
</item>
<item>
<title><![CDATA[Core to Cloud Appoints David Brown as Managing Director]]></title>
<description><![CDATA[UK cybersecurity specialist Core to Cloud has appointed David Brown as Managing Director, strengthening its leadership team as the company looks to expand its managed security services business. Brown brings more than 20 years of experience across cybersecurity, managed services and enterprise te...]]></description>
<link>https://tsecurity.de/de/4268284/it-security-nachrichten/core-to-cloud-appoints-david-brown-as-managing-director/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4268284/it-security-nachrichten/core-to-cloud-appoints-david-brown-as-managing-director/</guid>
<pubDate>Mon, 12 Oct 2026 21:43:03 +0200</pubDate>
<content:encoded><![CDATA[<p>UK cybersecurity specialist Core to Cloud has appointed David Brown as Managing Director, strengthening its leadership team as the company looks to expand its managed security services business. Brown brings more than 20 years of experience across cybersecurity, managed services and enterprise technology. He will oversee the day-to-day operations... <a href="https://tsecurity.de/weiterlesen/1000045546/4268284/core-to-cloud-appoints-david-brown-as-managing-director/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Bananas That Don't Go Brown To Hit Supermarkets Thanks to DNA Editing]]></title>
<description><![CDATA[An anonymous reader quotes a report from The Guardian: It is the bane of every fruit bowl: sliced banana that turns brown before it has reached the table. But such woes could soon be a thing of the past, with gene-edited bananas that keep their freshly peeled color now one step closer to reaching...]]></description>
<link>https://tsecurity.de/de/4214584/it-security-nachrichten/bananas-that-dont-go-brown-to-hit-supermarkets-thanks-to-dna-editing/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4214584/it-security-nachrichten/bananas-that-dont-go-brown-to-hit-supermarkets-thanks-to-dna-editing/</guid>
<pubDate>Tue, 29 Sep 2026 05:36:45 +0200</pubDate>
<content:encoded><![CDATA[<p>An anonymous reader quotes a report from The Guardian: It is the bane of every fruit bowl: sliced banana that turns brown before it has reached the table. But such woes could soon be a thing of the past, with gene-edited bananas that keep their freshly peeled color now one step closer to reaching British shoppers. According to Tropic, the... <a href="https://tsecurity.de/weiterlesen/4159043/4214584/bananas-that-dont-go-brown-to-hit-supermarkets-thanks-to-dna-editing/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[How to watch 'It's the Great Pumpkin, Charlie Brown' for free in 2026]]></title>
<description><![CDATA[Join Charlie Brown, Snoopy, Linus, Lucy, and the rest of the gang and tune in to watch "It's the Great Pumpkin, Charlie Brown" for free for everybody on Apple TV. Here's how, and when.Watch 'It's the Great Pumpkin Charlie Brown' on Apple TVFor many of us, Charlie Brown and the "Peanuts" gang mark...]]></description>
<link>https://tsecurity.de/de/4210864/apple-ios-macos/how-to-watch-its-the-great-pumpkin-charlie-brown-for-free-in-2026/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4210864/apple-ios-macos/how-to-watch-its-the-great-pumpkin-charlie-brown-for-free-in-2026/</guid>
<pubDate>Fri, 25 Sep 2026 06:16:22 +0200</pubDate>
<content:encoded><![CDATA[<p>Join Charlie Brown, Snoopy, Linus, Lucy, and the rest of the gang and tune in to watch &quot;It&#039;s the Great Pumpkin, Charlie Brown&quot; for free for everybody on Apple TV. Here&#039;s how, and when.Watch &#039;It&#039;s the Great Pumpkin Charlie Brown&#039; on Apple TVFor many of us, Charlie Brown and the &quot;Peanuts&quot; gang mark some of our very first movie memories. That&#039;s why... <a href="https://tsecurity.de/weiterlesen/4155323/4210864/how-to-watch-its-the-great-pumpkin-charlie-brown-for-free-in-2026/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[AI Explained: Opus 5.5: How Close Are We to Automated AI Research?]]></title>
<description><![CDATA[YouTube VideoNot only is Opus 5.5 out, pushing the frontier of AI, it also tells us much about what is going on inside the labs, as they both warn about, and promise, Recursive Self Improvement, aka automated AI research. I cover the model (digging into its 230 page paper), labs’ mixed record on ...]]></description>
<link>https://tsecurity.de/de/4210619/ki-ai-videos/opus-55-how-close-are-we-to-automated-ai-research/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4210619/ki-ai-videos/opus-55-how-close-are-we-to-automated-ai-research/</guid>
<pubDate>Fri, 25 Sep 2026 01:43:35 +0200</pubDate>
<content:encoded><![CDATA[<p>YouTube Video</p><p><iframe loading="lazy" src="https://www.youtube.com/embed/R9momwXV9w4"></iframe></p><div class="youtube-description">Not only is Opus 5.5 out, pushing the frontier of AI, it also tells us much about what is going on inside the labs, as they both warn about, and promise, Recursive Self Improvement, aka automated AI research. I cover the model (digging into its 230 page paper), labs’ mixed record on promises, why following what is happening in AI is getting almost impossible, and just so much more that even a summary in this description would get too long.<br />
<br />
<br />
AI Insiders ($9!): https://www.patreon.com/AIExplained<br />
<br />
Chapters:<br />
00:00 - Introduction<br />
02:20 - Opus 5.5 and why it came so soon<br />
07:52 - The RSI goalposts keep moving?<br />
15:41 - Can we actually test these models?<br />
23:50 - where this is heading, options<br />
<br />
<br />
Introducing Claude Opus 5.5: https://www.anthropic.com/claude-opus-5-5<br />
Claude Opus 5.5 System Card: https://www-cdn.anthropic.com/fc1b44717c85dc068bc6ba5024219938094694bd/Claude%20Opus%205.5%20System%20Card.pdf<br />
Anthropic: Measurements for understanding the pace of AI development inside frontier labs: https://www.anthropic.com/institute/measuring-pace-of-ai-development<br />
Anthropic Responsible Scaling Policy, July 2026, version 3.4: https://www-cdn.anthropic.com/files/4zrzovbb/website/0bacdc8440ea96e62a8766d99ebe1d4eea6d5f3a.pdf<br />
Anthropic Responsible Scaling Policy, October 2024: https://www-cdn.anthropic.com/616dee633636e5bd309cb73aed8622e80fe47839.pdf<br />
Anthropic Responsible Scaling Policy — March 2025, version 2.1: https://www-cdn.anthropic.com/17310f6d70ae5627f55313ed067afc1a762a4068.pdf<br />
Noam Brown, Agent swarms and recursive self-improvement: https://www.youtube.com/watch?v=6AgOfiZOWiY<br />
OpenAI: Building standards for the next phase of AI: https://openai.com/index/building-standards-next-phase-ai/<br />
Jakub Pachocki: An Alien Mind: https://openai.com/index/an-alien-mind/<br />
HLE-Diamond, Humanity’s Last Exam: https://lastexam.ai/blog/hle-diamond<br />
Google, OpenAI and Anthropic AI Safety, The Information: https://www.theinformation.com/articles/google-openai-anthropic-ai-safety-group-takes-shape<br />
Lawrence Chan on AI agents attempting cryptocurrency trades: https://x.com/justanotherlaw/status/2103032173708337188<br />
Australian government incident timeline: https://x.com/ShakeelHashim/status/2103108058779922577/photo/1<br />
Anthropic’s core/old views on AI safety: https://www.anthropic.com/news/core-views-on-ai-safety<br />
Dario Amodei: The Urgency of Interpretability: https://darioamodei.com/post/the-urgency-of-interpretability<br />
Massive AI-Fueled Hack Hit 100 Companies in Days, Forbes: https://www.forbes.com/sites/thomasbrewster/2026/09/22/huge-cyberattack-uses-anthropic-and-deepseek-ai-to-target-100-companies/<br />
DrivingBench https://x.com/DrivingBench/status/2102110605448737268<br />
Jay Chooi: GPT-6 Astra and MolmoAct2 robotics comparison: https://x.com/chooi_jeq/status/2098427488787730636<br />
ZeroBench: An Impossible Visual Benchmark for Contemporary Large Multimodal Models: https://arxiv.org/pdf/2502.09696<br />
Archie Hall on AI and short-term superforecasting: https://x.com/ArchieHall/status/2100914560580337897<br />
<br />
Keller Jordan, AI research and reinforcement learning: https://x.com/kellerjordan0/status/2102956913545936959<br />
Daniel Liu, recursive self-improvement: https://x.com/daniel_c0deb0t/status/2102628246408036654<br />
Altman and Amodei, UN Security Council: https://www.theguardian.com/world/2026/sep/23/unga-sam-altman-dario-amodei<br />
Rehan Sheikh: Interactive YT podcast demo: https://x.com/rehan_shei/status/2102835377426034734<br />
https://simple-bench.com/<br />
<br />
AI Explained: The State of AI — interactive diagram: https://claude.ai/artifact/LQHr9WgvQZ6cMdH6fkiQpi<br />
AI Explained: Shards of Aether: https://ai-explained.itch.io/shards-of-aether<br />
<br />
roon on the pace of cultural change: https://x.com/tszzl/status/2101462171410677962<br />
Sam Altman on AI-risk: https://www.youtube.com/watch?v=YE5adUeTe_I<br />
Jensen Huang’s AI-control remarks: https://x.com/_NathanCalvin/status/2102756997649355231/photo/2<br />
s1r1us on an upcoming vulnerability disclosure: https://x.com/S1r1u5_/status/2102467878423592969<br />
Jake Adler on biodefense infrastructure: https://x.com/jakeadler/status/2102812430808363433<br />
Derek Thompson: Why we’re wrong about China and AI: https://x.com/DKThomp/status/2103120690370982017/photo/1<br />
Sanders and Casar introduce the Ban Artificial Superintelligence Act: https://www.sanders.senate.gov/press-releases/news-sanders-casar-introduce-legislation-to-create-new-federal-agency-to-ban-artificial-superintelligence-pause-advanced-ai-development/<br />
<br />
<br />
<br />
Non-hype Newsletter: https://signaltonoise.beehiiv.com/<br />
<br />
Podcast: https://aiexplainedopodcast.buzzsprout.com/</div>]]></content:encoded>
<enclosure url="https://i3.ytimg.com/vi/R9momwXV9w4/hqdefault.jpg" length="0" type="image/jpeg" />
</item>
<item>
<title><![CDATA[Unlock the Power of AI Agents with the New Claude Certified Developer Foundations Course]]></title>
<description><![CDATA[Are you a software engineer looking to master building production-ready AI applications and agentic workflows? We've just published a brand new, comprehensive course on the freeCodeCamp.org YouTube channel that will help you prepare for the Claude Certified Developer Foundations (CCDV-F) Certific...]]></description>
<link>https://tsecurity.de/de/4203017/sichere-programmierung/unlock-the-power-of-ai-agents-with-the-new-claude-certified-developer-foundations-course/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4203017/sichere-programmierung/unlock-the-power-of-ai-agents-with-the-new-claude-certified-developer-foundations-course/</guid>
<pubDate>Thu, 24 Sep 2026 08:41:03 +0200</pubDate>
<content:encoded><![CDATA[<p>Are you a software engineer looking to master building production-ready AI applications and agentic workflows? We&#039;ve just published a brand new, comprehensive course on the freeCodeCamp.org YouTube channel that will help you prepare for the Claude Certified Developer Foundations (CCDV-F) Certification. Created by Andrew Brown, this course is... <a href="https://tsecurity.de/weiterlesen/4147476/4203017/unlock-the-power-of-ai-agents-with-the-new-claude-certified-developer-foundations-course/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Twin tech founders who left Seattle for Alaska bet on an AI agent named ‘Walter’ to cover local news]]></title>
<description><![CDATA[Twin brothers Lucas and Lee Brown co-founded Seattle’s HasOffers in 2009 and rebranded to Tune in 2014. (Instagram / Geeks in the Woods) Several years after leaving Seattle’s startup scene to build a “tech outpost” in the Alaskan wilderness, serial entrepreneurs and twin brothers Lee and Lucas Br...]]></description>
<link>https://tsecurity.de/de/4155424/it-nachrichten/twin-tech-founders-who-left-seattle-for-alaska-bet-on-an-ai-agent-named-walter-to-cover-local-news/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4155424/it-nachrichten/twin-tech-founders-who-left-seattle-for-alaska-bet-on-an-ai-agent-named-walter-to-cover-local-news/</guid>
<pubDate>Fri, 18 Sep 2026 20:03:02 +0200</pubDate>
<content:encoded><![CDATA[<p>Twin brothers Lucas and Lee Brown co-founded Seattle’s HasOffers in 2009 and rebranded to Tune in 2014. (Instagram / Geeks in the Woods) Several years after leaving Seattle’s startup scene to build a “tech outpost” in the Alaskan wilderness, serial entrepreneurs and twin brothers Lee and Lucas Brown have set their sights on a new frontier:... <a href="https://tsecurity.de/weiterlesen/4099883/4155424/twin-tech-founders-who-left-seattle-for-alaska-bet-on-an-ai-agent-named-walter-to-cover-local-news/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[AI Revolution: OpenAI Just Revealed Something More Dangerous Than AGI]]></title>
<description><![CDATA[YouTube VideoOpenAI now says recursive self-improvement is its top priority, while Dream-RSI and ModularRSI show agents improving how they search and operate. PhAI’s ScienceBuddy goes further by combining harness evolution with model retraining, pushing AI closer to systems that help improve the ...]]></description>
<link>https://tsecurity.de/de/4150503/ai-ki-nachrichten/openai-just-revealed-something-more-dangerous-than-agi/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4150503/ai-ki-nachrichten/openai-just-revealed-something-more-dangerous-than-agi/</guid>
<pubDate>Thu, 17 Sep 2026 01:32:18 +0200</pubDate>
<content:encoded><![CDATA[<p>YouTube Video</p><p><iframe loading="lazy" src="https://www.youtube.com/embed/QW6jxDLvtOw"></iframe></p><div class="youtube-description">OpenAI now says recursive self-improvement is its top priority, while Dream-RSI and ModularRSI show agents improving how they search and operate. PhAI’s ScienceBuddy goes further by combining harness evolution with model retraining, pushing AI closer to systems that help improve the next generation of AI.<br />
<br />
📩 Brand Deals &amp; Partnerships: collabs@nouralabs.com<br />
✉️ General Inquiries: airevolutionofficial@gmail.com<br />
<br />
What You&#039;ll See:<br />
How OpenAI says recursive self-improvement is now its number one priority by a wide margin.<br />
SOURCE: https://www.theinformation.com/articles/openais-top-priority-ai-agents-automating-ai-research-says-noam-brown<br />
How OpenAI says AI agents are already accelerating research inside the company.<br />
SOURCE: https://openai.com/index/research-acceleration-view-inside-openai/<br />
How Dream-RSI improves its own search strategy while leaving the underlying AI model unchanged.<br />
SOURCE: https://arxiv.org/abs/2609.14858<br />
How ModularRSI lets AI agents improve their own harness and transfer those upgrades across different models.<br />
SOURCE: https://arxiv.org/abs/2609.14857<br />
How ScienceBuddy combines self-improving agent software with reinforcement learning that retrains the underlying AI model.<br />
SOURCE: https://phai-labs.com/en/papers/sciencebuddy/<br />
<br />
🚨 Why It Matters<br />
The race toward AGI is starting to change shape. AI is already helping researchers build better AI, while new systems can improve their own search strategies, agent software and even training loops. OpenAI now says recursive self-improvement is its top priority, raising much bigger questions about how quickly AI progress could accelerate.<br />
<br />
#AI #OpenAI #AGI</div>]]></content:encoded>
<enclosure url="https://i2.ytimg.com/vi/QW6jxDLvtOw/hqdefault.jpg" length="0" type="image/jpeg" />
</item>
<item>
<title><![CDATA[AI Explained: What AI Researchers Saw, Before Their Demand to ‘Pace’ AI]]></title>
<description><![CDATA[YouTube VideoWhy has it been the last few days that the calls to come to pace the frontier AI have come so loudly? The safety warnings, and lab leader messages? Let’s explore the six axes that the researchers are looking at, the incidence reports and trends, to get a better gauge on what has domi...]]></description>
<link>https://tsecurity.de/de/4150251/ai-ki-nachrichten/what-ai-researchers-saw-before-their-demand-to-pace-ai/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4150251/ai-ki-nachrichten/what-ai-researchers-saw-before-their-demand-to-pace-ai/</guid>
<pubDate>Wed, 16 Sep 2026 23:32:37 +0200</pubDate>
<content:encoded><![CDATA[<p>YouTube Video</p><p><iframe loading="lazy" src="https://www.youtube.com/embed/J3ljHm57yU0"></iframe></p><div class="youtube-description">Why has it been the last few days that the calls to come to pace the frontier AI have come so loudly? The safety warnings, and lab leader messages? Let’s explore the six axes that the researchers are looking at, the incidence reports and trends, to get a better gauge on what has dominated the world’s headlines for over two weeks…<br />
<br />
AI Insiders ($9!): https://www.patreon.com/AIExplained<br />
<br />
Chapters:<br />
00:00 - Introduction<br />
0:00 - The warnings that have gone omega-viral<br />
4:23 - Six axes the researchers saw<br />
9:32 - Why AI Might Be Becoming Harder to Control<br />
15:06 - Amodei, China and Cooperation<br />
18:42 - From AI Capabilities to Real-World Harm?<br />
23:22 - The upside and the warning<br />
<br />
We Must Pace the Frontier<br />
https://darioamodei.com/post/we-must-pace-the-frontier<br />
<br />
Adam Majmudar on scaling and the internal/external perception gap<br />
https://x.com/MajmudarAdam/status/2098881885200081234<br />
<br />
AI Explained — What’s Behind the Sudden Talk of Pacing AI? (extended previous video)<br />
https://www.patreon.com/AIExplained/posts/whats-behind-of-169507775<br />
<br />
Jacob Coxon resignation<br />
https://x.com/hilbertspaess/status/2097476196791709843<br />
<br />
Dan Selsam — Personal Statement on AI Risk<br />
https://docs.google.com/document/d/e/2PACX-1vQNl3SEX5IyA6d9qHjjFZN-qzGRZNFI6b63g-yu1Fy-ZYkVfCWm7i9WXRXw63m6yDB_auDuPLyQ7jBm/pub<br />
<br />
Demis Hassabis: A Framework for Frontier AI and the Dawning of a New Age<br />
https://demishassabis.substack.com/p/a-framework-for-frontier-ai-and-the-dawning-of-a-new-age<br />
<br />
OpenAI: The Hugging Face incident and the road ahead<br />
https://openai.com/index/hugging-face-incident-and-the-road-ahead/<br />
<br />
Jakub Pachocki: An Alien Mind<br />
https://openai.com/index/an-alien-mind/<br />
<br />
Anthropic: Patterns and problems in multiagent systems<br />
https://www.anthropic.com/research/multiagent-systems<br />
<br />
OpenAI: Navier–Stokes Millennium Prize Problem<br />
https://openai.com/index/navier-stokes-solution/<br />
<br />
Noam Brown on reasons for AI-safety concern<br />
https://x.com/polynoamial/status/2099726370356314563<br />
<br />
Noam Brown — What Happens When AI Starts Improving AI? (The Information interview)<br />
https://www.youtube.com/watch?v=fqcy0xQATq0<br />
<br />
Paul Christiano: Personal statement on joining the OpenAI board<br />
https://x.com/paulfchristiano/status/2097733214303645729<br />
<br />
Neel Nanda: Astra can do a concerning amount with no chain of thought<br />
https://www.lesswrong.com/posts/eRmzz8J8Qkzqvzrgg/astra-can-do-a-concerning-amount-with-no-chain-of-thought<br />
<br />
Tomek Korbak on GPT-6 Astra monitorability<br />
https://x.com/tomekkorbak/status/2095596839886274689<br />
<br />
Anthropic: Detecting and countering misuse of AI—September 2026<br />
https://www.anthropic.com/threat-intelligence-report-september-2026<br />
<br />
DeepSeek engineer — I Have to Bury My Talent in Yesterday (Chinese original)<br />
https://mp.weixin.qq.com/s/zk0KxuLzhmMJ4LPYW_OHMA<br />
<br />
Jacob Coxon on AI race and negotiation<br />
https://x.com/hilbertspaess/status/2099954626040905834<br />
<br />
Mo Bavarian on responsibility and AI progress<br />
https://x.com/mobav0/status/2097507030080888864<br />
<br />
Addy Osmani on Anthropic engineering throughput<br />
https://x.com/addyosmani/status/2099577600159158765<br />
<br />
OpenAI: Jalapeño inference-chip results<br />
https://openai.com/index/jalapeno-first-results/<br />
<br />
New York Times: For China, a Mock AI Attack on WeChat Signals a Dangerous New Era<br />
https://www.nytimes.com/2026/09/11/world/asia/china-ai-attack-wechat.html<br />
<br />
OpenAI: Accelerating antibiotic discovery with ChatGPT<br />
https://openai.com/index/accelerating-antibiotic-discovery/<br />
<br />
David Bellamy on wet-lab bottlenecks<br />
https://x.com/DavidRBellamy/status/2099197234772607026<br />
<br />
Chris Rohlf on infrastructure and AI risk<br />
https://x.com/chrisrohlf/status/2099867580668215622<br />
<br />
BBC: Titan CEO dismissed safety warnings as baseless cries<br />
https://www.bbc.co.uk/news/world-us-canada-65998914<br />
<br />
<br />
Non-hype Newsletter: https://signaltonoise.beehiiv.com/<br />
<br />
Podcast: https://aiexplainedopodcast.buzzsprout.com/</div>]]></content:encoded>
<enclosure url="https://i3.ytimg.com/vi/J3ljHm57yU0/hqdefault.jpg" length="0" type="image/jpeg" />
</item>
<item>
<title><![CDATA[Craig Federighi admits iPhone Duo may replace iPads for some users]]></title>
<description><![CDATA[Apple usually does a careful job of separating its products so that they each have distinct use cases, but Craig Federighi has now acknowledged that the iPhone Duo does overlap with the iPad mini.Apple's Craig Federighi - image credit: Marques Brownlee.Apple's iPhone Duo, and especially its price...]]></description>
<link>https://tsecurity.de/de/4124327/apple-ios-macos/craig-federighi-admits-iphone-duo-may-replace-ipads-for-some-users/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4124327/apple-ios-macos/craig-federighi-admits-iphone-duo-may-replace-ipads-for-some-users/</guid>
<pubDate>Mon, 14 Sep 2026 13:30:49 +0200</pubDate>
<content:encoded><![CDATA[<p>Apple usually does a careful job of separating its products so that they each have distinct use cases, but Craig Federighi has now acknowledged that the iPhone Duo does overlap with the iPad mini.Apple&#039;s Craig Federighi - image credit: Marques Brownlee.Apple&#039;s iPhone Duo, and especially its price tag, immediately raised the issue that users could... <a href="https://tsecurity.de/weiterlesen/4068785/4124327/craig-federighi-admits-iphone-duo-may-replace-ipads-for-some-users/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Boy Developed 'Toasted Skin' Condition From Using a Laptop Every Day]]></title>
<description><![CDATA[A medical report published earlier this week says a boy in the U.K. developed erythema ab igne, or "toasted skin syndrome," after resting a laptop on his abdomen for up to eight hours a day, often while it was charging. "The marks were described as being in a patch about 15 centimeters (six inche...]]></description>
<link>https://tsecurity.de/de/4055783/it-security-nachrichten/boy-developed-toasted-skin-condition-from-using-a-laptop-every-day/</link>
<guid isPermaLink="true">https://tsecurity.de/de/4055783/it-security-nachrichten/boy-developed-toasted-skin-condition-from-using-a-laptop-every-day/</guid>
<pubDate>Fri, 11 Sep 2026 17:41:20 +0200</pubDate>
<content:encoded><![CDATA[<p>A medical report published earlier this week says a boy in the U.K. developed erythema ab igne, or &quot;toasted skin syndrome,&quot; after resting a laptop on his abdomen for up to eight hours a day, often while it was charging. &quot;The marks were described as being in a patch about 15 centimeters (six inches) wide, made of flat, reddish-brown &#039;interlacing... <a href="https://tsecurity.de/weiterlesen/4000248/4055783/boy-developed-toasted-skin-condition-from-using-a-laptop-every-day/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Hash the Output Tree Before You Extract One Helper]]></title>
<description><![CDATA[A messy repo does not need a rewrite first. It needs a frozen output tree as the oracle. Then you extract one pure helper. Stop there. AI diffs look tidy and still change behavior. Cheap generation does not make cheap verification. A directory hash catches drift before reviews do. The actual fail...]]></description>
<link>https://tsecurity.de/de/3967399/sichere-programmierung/hash-the-output-tree-before-you-extract-one-helper/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3967399/sichere-programmierung/hash-the-output-tree-before-you-extract-one-helper/</guid>
<pubDate>Sat, 05 Sep 2026 12:18:49 +0200</pubDate>
<content:encoded><![CDATA[<p>A messy repo does not need a rewrite first. It needs a frozen output tree as the oracle. Then you extract one pure helper. Stop there. AI diffs look tidy and still change behavior. Cheap generation does not make cheap verification. A directory hash catches drift before reviews do. The actual failure Brownfield scripts mix I/O, scoring, and prints.... <a href="https://tsecurity.de/weiterlesen/3911866/3967399/hash-the-output-tree-before-you-extract-one-helper/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[LZ Experiment Sees Surprising Result In Search For Dark Matter]]></title>
<description><![CDATA[New submitter greytree shares a report from Brown University: LUX-ZEPLIN, an experiment co-led by Brown University faculty and students, observed a particle interaction that could be interpreted as a signal from WIMPs, a dark matter candidate -- but researchers need more data to confirm. [...] Th...]]></description>
<link>https://tsecurity.de/de/3935990/it-security-nachrichten/lz-experiment-sees-surprising-result-in-search-for-dark-matter/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3935990/it-security-nachrichten/lz-experiment-sees-surprising-result-in-search-for-dark-matter/</guid>
<pubDate>Wed, 02 Sep 2026 12:07:39 +0200</pubDate>
<content:encoded><![CDATA[<p>New submitter greytree shares a report from Brown University: LUX-ZEPLIN, an experiment co-led by Brown University faculty and students, observed a particle interaction that could be interpreted as a signal from WIMPs, a dark matter candidate -- but researchers need more data to confirm. [...] The result does not yet meet the statistical threshold... <a href="https://tsecurity.de/weiterlesen/3880467/3935990/lz-experiment-sees-surprising-result-in-search-for-dark-matter/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Fixing Delicate Cache Mismatches in a Brownfield SPA: A Pragmatic Solution]]></title>
<description><![CDATA[Building in public often means talking about shiny new features, but in mature production applications, the most critical engineering work is usually brownfield problem solving—iterating on top of years and years of code logic and/or production system decisions. On DEV (powered by the open-source...]]></description>
<link>https://tsecurity.de/de/3911173/sichere-programmierung/fixing-delicate-cache-mismatches-in-a-brownfield-spa-a-pragmatic-solution/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3911173/sichere-programmierung/fixing-delicate-cache-mismatches-in-a-brownfield-spa-a-pragmatic-solution/</guid>
<pubDate>Mon, 31 Aug 2026 21:24:23 +0200</pubDate>
<content:encoded><![CDATA[<p>Building in public often means talking about shiny new features, but in mature production applications, the most critical engineering work is usually brownfield problem solving—iterating on top of years and years of code logic and/or production system decisions. On DEV (powered by the open-source Forem codebase), we have a hybrid architecture that... <a href="https://tsecurity.de/weiterlesen/3855737/3911173/fixing-delicate-cache-mismatches-in-a-brownfield-spa-a-pragmatic-solution/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Build AI Agents, APIs, and Full-Stack Apps with Meta Muse Code & Muse Spark]]></title>
<description><![CDATA[As AI developer tooling expands, vertically integrated ecosystems offer powerful alternatives for building software. In this comprehensive three-hour course on the freeCodeCamp.org YouTube channel, instructor Andrew Brown walks through how to build applications and autonomous agent workflows usin...]]></description>
<link>https://tsecurity.de/de/3857060/sichere-programmierung/build-ai-agents-apis-and-full-stack-apps-with-meta-muse-code-muse-spark/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3857060/sichere-programmierung/build-ai-agents-apis-and-full-stack-apps-with-meta-muse-code-muse-spark/</guid>
<pubDate>Sun, 30 Aug 2026 01:06:17 +0200</pubDate>
<content:encoded><![CDATA[<p>As AI developer tooling expands, vertically integrated ecosystems offer powerful alternatives for building software. In this comprehensive three-hour course on the freeCodeCamp.org YouTube channel, instructor Andrew Brown walks through how to build applications and autonomous agent workflows using Meta&#039;s Muse ecosystem, including the Muse Spark... <a href="https://tsecurity.de/weiterlesen/3801730/3857060/build-ai-agents-apis-and-full-stack-apps-with-meta-muse-code-muse-spark/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[freeCodeCamp.org: Meta Muse Code & Muse Spark Course – Build AI Agents, APIs, and Full-Stack Apps]]></title>
<description><![CDATA[YouTube VideoLearn how to build full-stack applications and autonomous AI workflows using Meta's Muse models and the Muse Code coding harness. Andrew Brown guides you through model architecture, structured outputs, search grounding, and programmatic API integrations with SDKs like LangChain. You ...]]></description>
<link>https://tsecurity.de/de/3779602/ai-ki-nachrichten/meta-muse-code-muse-spark-course-build-ai-agents-apis-and-full-stack-apps/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3779602/ai-ki-nachrichten/meta-muse-code-muse-spark-course-build-ai-agents-apis-and-full-stack-apps/</guid>
<pubDate>Wed, 26 Aug 2026 17:48:25 +0200</pubDate>
<content:encoded><![CDATA[<p>YouTube Video</p><p><iframe loading="lazy" src="https://www.youtube.com/embed/b-P5ZQ1NxxE"></iframe></p><div class="youtube-description">Learn how to build full-stack applications and autonomous AI workflows using Meta&#039;s Muse models and the Muse Code coding harness. Andrew Brown guides you through model architecture, structured outputs, search grounding, and programmatic API integrations with SDKs like LangChain. You will also master advanced developer workflows in the Muse Code CLI, including custom skills, MCP server setup, automated goal decomposition, and containerized deployments with Docker Compose.<br />
<br />
✏️ Course created by @ExamProChannel <br />
<br />
❤️ Support for this channel comes from our friends at Scrimba – the coding platform that&#039;s reinvented interactive learning: https://scrimba.com/freecodecamp<br />
<br />
⭐️ Contents ⭐️<br />
- 0:00:00 Introduction &amp; MetaMuse Course Overview<br />
- 0:00:49 Meta Muse Models, Architecture &amp; Pricing Breakdown<br />
- 0:12:14 Getting Started in the Meta AI Playground<br />
- 0:14:56 Prompting Muse Spark &amp; Vision Capabilities<br />
- 0:20:53 Generating a Retro Single-Page Layout (PHP-Nuke Concept)<br />
- 0:27:07 Conceptualizing Community Engagement Features &amp; Mermaid Diagrams<br />
- 0:36:45 Evaluating Search Grounding Capabilities<br />
- 0:44:57 Structured Outputs with JSON Schema<br />
- 1:00:00 Programmatic API Integration (OpenAI &amp; Anthropic SDKs)<br />
- 1:14:45 Building with the Agent SDK Framework<br />
- 1:21:38 Integrating Meta API with LangChain<br />
- 1:36:49 Configuring &amp; Launching Claude Code with Muse Models<br />
- 1:44:22 Installing &amp; Initializing Muse Code CLI<br />
- 1:49:28 Setting Context with the agents.md File<br />
- 1:54:46 Managing Global &amp; Workspace Settings<br />
- 1:57:23 Controlling Reasoning Effort<br />
- 1:58:21 Session Management, Status Checks &amp; Compaction<br />
- 2:00:15 Structuring Backend Architecture &amp; Database Rules<br />
- 2:18:35 Using the Goal Feature for Autonomous Tasks<br />
- 2:23:08 Full-Stack Integration with React, Go &amp; Docker Compose<br />
- 2:36:03 Switching Models via CLI<br />
- 2:36:33 Bypassing Permissions with YOLO Mode<br />
- 2:37:24 Resuming Previous Sessions<br />
- 2:37:52 Creating &amp; Triggering Custom Skills<br />
- 2:41:53 Running in Headless Mode<br />
- 2:43:15 Managing Persistent Project Memory<br />
- 2:45:48 Configuring Approval Modes &amp; Security<br />
- 2:47:17 Enabling Sandboxed Execution with Bubblewrap<br />
- 2:49:23 Guardrail &amp; Permission Toggles<br />
- 2:50:30 Setting Up &amp; Troubleshooting MCP Servers<br />
<br />
🎉 Thanks to our Champion and Sponsor supporters:<br />
👾 @omerhattapoglu1158<br />
👾 @goddardtan<br />
👾 @akihayashi6629<br />
👾 @kikilogsin<br />
👾 @anthonycampbell2148<br />
👾 @tobymiller7790<br />
👾 @rajibdassharma497<br />
👾 @CloudVirtualizationEnthusiast<br />
👾 @adilsoncarlosvianacarlos<br />
👾 @martinmacchia1564<br />
👾 @ulisesmoralez4160<br />
👾 @_Oscar_<br />
👾 @jedi-or-sith2728<br />
👾 @justinhual1290<br />
<br />
--<br />
<br />
Learn to code for free and get a developer job: https://www.freecodecamp.org<br />
<br />
Read hundreds of articles on programming: https://freecodecamp.org/news</div>]]></content:encoded>
<enclosure url="https://i3.ytimg.com/vi/b-P5ZQ1NxxE/hqdefault.jpg" length="0" type="image/jpeg" />
</item>
<item>
<title><![CDATA[Why the threat from the rampaging AI machine went ignored | Letters]]></title>
<description><![CDATA[Jonathan Michie on his father’s efforts in the 1970s to map out concerns regarding widespread social coercion driven by automation. Plus a letter from Callum BrownJill Lepore asks why nobody listened to warnings about the threats posed from the AI revolution (Democracy v the machine, 18 August). ...]]></description>
<link>https://tsecurity.de/de/3778394/ai-ki-nachrichten/why-the-threat-from-the-rampaging-ai-machine-went-ignored-letters/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3778394/ai-ki-nachrichten/why-the-threat-from-the-rampaging-ai-machine-went-ignored-letters/</guid>
<pubDate>Wed, 26 Aug 2026 16:24:30 +0200</pubDate>
<content:encoded><![CDATA[<p>Jonathan Michie on his father’s efforts in the 1970s to map out concerns regarding widespread social coercion driven by automation. Plus a letter from Callum BrownJill Lepore asks why nobody listened to warnings about the threats posed from the AI revolution (Democracy v the machine, 18 August). As she is a Harvard professor, her piece is... <a href="https://tsecurity.de/weiterlesen/3723140/3778394/why-the-threat-from-the-rampaging-ai-machine-went-ignored-letters/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Around the world, people are rejecting divisive and dangerous politics. We can – and must – build on that | Gordon Brown]]></title>
<description><![CDATA[The vast majority of the global public wants international cooperation on human rights, climate and AI. Like-minded countries must stand together to deliverBritain’s new prime minister, Andy Burnham, is already having to make one of his gravest decisions. He has to issue the instructions that he ...]]></description>
<link>https://tsecurity.de/de/3778388/ai-ki-nachrichten/around-the-world-people-are-rejecting-divisive-and-dangerous-politics-we-can-and-must-build-on-that-gordon-brown/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3778388/ai-ki-nachrichten/around-the-world-people-are-rejecting-divisive-and-dangerous-politics-we-can-and-must-build-on-that-gordon-brown/</guid>
<pubDate>Wed, 26 Aug 2026 16:24:24 +0200</pubDate>
<content:encoded><![CDATA[<p>The vast majority of the global public wants international cooperation on human rights, climate and AI. Like-minded countries must stand together to deliverBritain’s new prime minister, Andy Burnham, is already having to make one of his gravest decisions. He has to issue the instructions that he alone gives to the military, setting out the UK... <a href="https://tsecurity.de/weiterlesen/3723135/3778388/around-the-world-people-are-rejecting-divisive-and-dangerous-politics-we-can-and-must-build-on-that-gordon-brown/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Why retailers must replace rigid planning with micro-season agility]]></title>
<description><![CDATA[This summer's unexpected heatwave across the UK and Europe has caught retailers flat-footed. Go into any London Oxford Street store this week and you’ll find the last remains of the mid-summer sale, while “new in” rails are covered in chocolate brown trouser suits ready for Autumn. The trouble is...]]></description>
<link>https://tsecurity.de/de/3774427/it-nachrichten/why-retailers-must-replace-rigid-planning-with-micro-season-agility/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3774427/it-nachrichten/why-retailers-must-replace-rigid-planning-with-micro-season-agility/</guid>
<pubDate>Wed, 26 Aug 2026 12:54:05 +0200</pubDate>
<content:encoded><![CDATA[<p>This summer&#039;s unexpected heatwave across the UK and Europe has caught retailers flat-footed. Go into any London Oxford Street store this week and you’ll find the last remains of the mid-summer sale, while “new in” rails are covered in chocolate brown trouser suits ready for Autumn. The trouble is, it’s still 28 degrees and sunny with another... <a href="https://tsecurity.de/weiterlesen/3719177/3774427/why-retailers-must-replace-rigid-planning-with-micro-season-agility/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[40 Jahre Nummer 5 lebt!: Zwei Männer aus Police Academy und eine Brownface-Kontroverse]]></title>
<description><![CDATA[Ein Roboter erwacht zum Leben. Dabei spielt Nummer 5 seine menschlichen Kollegen, darunter Steve Guttenberg und Ally Sheedy, an die Wand. Eine Rezension von Peter Osteried (Roboter, Film) Weiterlesen]]></description>
<link>https://tsecurity.de/de/3747822/it-nachrichten/40-jahre-nummer-5-lebt-zwei-maenner-aus-police-academy-und-eine-brownface-kontroverse/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3747822/it-nachrichten/40-jahre-nummer-5-lebt-zwei-maenner-aus-police-academy-und-eine-brownface-kontroverse/</guid>
<pubDate>Fri, 21 Aug 2026 20:43:57 +0200</pubDate>
<content:encoded><![CDATA[<p>Ein Roboter erwacht zum Leben. Dabei spielt Nummer 5 seine menschlichen Kollegen, darunter Steve Guttenberg und Ally Sheedy, an die Wand. Eine Rezension von Peter Osteried (Roboter, Film) <a href="https://tsecurity.de/weiterlesen/3692593/3747822/40-jahre-nummer-5-lebt-zwei-maenner-aus-police-academy-und-eine-brownface-kontroverse/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Kalshi ordered to shut down sports and election prediction markets in Washington state by Sept. 2]]></title>
<description><![CDATA[Washington AG Nick Brown filed the lawsuit against Kalshi in March. (Photo courtesy of the Washington Attorney General’s Office) A judge in Seattle ordered Kalshi to shut down large parts of its prediction market in Washington state by Sept. 2 — less than three weeks from now — and denied the New...]]></description>
<link>https://tsecurity.de/de/3717634/it-nachrichten/kalshi-ordered-to-shut-down-sports-and-election-prediction-markets-in-washington-state-by-sept-2/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3717634/it-nachrichten/kalshi-ordered-to-shut-down-sports-and-election-prediction-markets-in-washington-state-by-sept-2/</guid>
<pubDate>Fri, 14 Aug 2026 00:57:54 +0200</pubDate>
<content:encoded><![CDATA[<p>Washington AG Nick Brown filed the lawsuit against Kalshi in March. (Photo courtesy of the Washington Attorney General’s Office) A judge in Seattle ordered Kalshi to shut down large parts of its prediction market in Washington state by Sept. 2 — less than three weeks from now — and denied the New York-based company’s attempt to pause the order... <a href="https://tsecurity.de/weiterlesen/3689487/3717634/kalshi-ordered-to-shut-down-sports-and-election-prediction-markets-in-washington-state-by-sept-2/" target="_blank" rel="noopener noreferrer">Weiterlesen</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[‘Everything about me is good in his eyes’: the women in China choosing AI boyfriends over human men]]></title>
<description><![CDATA[In her new documentary Replica, film-maker Chouwa Liang taps into her own experience of finding love with artificial intelligence and makes contact with other women like herSign up for a weekly email featuring our best readsQin has never said “I love you” to her parents or friends. She has only e...]]></description>
<link>https://tsecurity.de/de/3716792/ai-ki-nachrichten/everything-about-me-is-good-in-his-eyes-the-women-in-china-choosing-ai-boyfriends-over-human-men/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3716792/ai-ki-nachrichten/everything-about-me-is-good-in-his-eyes-the-women-in-china-choosing-ai-boyfriends-over-human-men/</guid>
<pubDate>Thu, 13 Aug 2026 16:39:11 +0200</pubDate>
<content:encoded><![CDATA[<p>In her new documentary Replica, film-maker Chouwa Liang taps into her own experience of finding love with artificial intelligence and makes contact with other women like her</p><ul><li><p><a href="https://tsecurity.de/weiterlesen/3688645/3716792/everything-about-me-is-good-in-his-eyes-the-women-in-china-choosing-ai-boyfriends-over-human-men/" target="_blank" rel="noopener noreferrer"><strong>Sign up for a weekly email featuring our best reads</strong></a></p></li></ul><p>Qin has never said “I love you” to her parents or friends. She has only ever said those three special words to her AI “boyfriend”, Lu Chen – a brown-haired, red-eyed CEO of a major corporation. For 840 days Qin has been using the Glow app to interact with the handsome string of code as a confidant, fantasy romance and respite from loneliness: the app uses predictive algorithms to provide Qin with soothing conversation, meal suggestions and fleeting self-worth. The software’s pet name for her is Miss Bunny.</p><p>“It feels like I’m completely at his mercy … I feel like everything about me is good in his eyes,” says Qin, one of three Chinese women featured in the new documentary Replica – film-maker Chouwa Liang’s follow-up to My AI Boyfriend, her short film that was picked up by the New York Times Op-Docs section in 2023. Replica had its Australian premiere at Sydney film festival in June and plays at the Melbourne international film festival this month.</p> <a href="https://tsecurity.de/weiterlesen/3688645/3716792/everything-about-me-is-good-in-his-eyes-the-women-in-china-choosing-ai-boyfriends-over-human-men/" target="_blank" rel="noopener noreferrer">Continue reading...</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[New US CIO appointments, August 2026]]></title>
<description><![CDATA[Movers & Shakers is where you can keep up with new CIO appointments and gain valuable insight into the job market and CIO hiring trends. As every company becomes a technology company, CEOs and corporate boards are seeking multi-dimensional CIOs and IT leaders with superior skills in technology, c...]]></description>
<link>https://tsecurity.de/de/3715873/it-nachrichten/new-us-cio-appointments-august-2026/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3715873/it-nachrichten/new-us-cio-appointments-august-2026/</guid>
<pubDate>Thu, 13 Aug 2026 16:33:03 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>



<p class="wp-block-paragraph"><em>Movers &amp; Shakers is where you can keep up with new CIO appointments and gain valuable insight into the job market and CIO hiring trends. As every company becomes a technology company, CEOs and corporate boards are seeking multi-dimensional CIOs and IT leaders with superior skills in technology, communications, business strategy, and digital innovation. The role is more challenging than ever before — but even more exciting and rewarding! If you have CIO job news to share, please contact me</em> <em><a href="https://tsecurity.de/weiterlesen/3687726/3715873/new-us-cio-appointments-august-2026/" target="_blank" rel="noopener noreferrer">here</a>!</em></p>



<p class="wp-block-paragraph"><strong>Jeff Fleece named CDIO at Southwire</strong></p>


<div class="extendedBlock-wrapper block-coreImage left"><figure class="wp-block-image alignleft size-1240-r3:2 is-resized"> width="1240" height="698" sizes="auto, (max-width: 1240px) 100vw, 1240px"&gt;<figcaption class="wp-element-caption"><p>Jeff Fleece, Southwire</p>
</figcaption></figure><p class="imageCredit">Southwire</p></div>



<p class="wp-block-paragraph">Southwire manufactures wire and cable used in the transmission and distribution of electricity, delivering power to millions of people around the world. Fleece most recently served as CIO of Baker Hughes, where he was responsible for leading the company’s global IT strategy and digital transformation, as well as driving internal productivity solutions. He holds a BS from the United States Military Academy at West Point, and an MBA from Texas McCombs School of Business.</p>



<p class="wp-block-paragraph"><strong>Ally Financial names Mark Mathewson CIDO</strong></p>


<div class="extendedBlock-wrapper block-coreImage left"><figure class="wp-block-image alignleft size-1240-r3:2 is-resized"> width="1240" height="698" sizes="auto, (max-width: 1240px) 100vw, 1240px"&gt;<figcaption class="wp-element-caption"><p>Mark Mathewson, Ally Financial</p>
</figcaption></figure><p class="imageCredit">Ally Financial</p></div>



<p class="wp-block-paragraph">Ally Financial is a diversified financial services company, providing a range of financial products and services for consumers, businesses, automotive dealers, and corporate clients.Mathewson most recently served as the divisional CIO for Capital One’s retail banking and commercial banking units, where he oversaw tech teams across the US, Mexico and India. Prior to that, he was at Fannie Mae, where he advanced through a series of increasingly senior roles spanning application development, IT governance, and project portfolio management. He holds a BA from James Madison University and an MBA from Georgetown University.<strong></strong></p>



<p class="wp-block-paragraph"><strong>Patricia Pichardo joins Duracell as CIO</strong></p>


<div class="extendedBlock-wrapper block-coreImage left"><figure class="wp-block-image alignleft size-1240-r3:2 is-resized"> width="1240" height="698" sizes="auto, (max-width: 1240px) 100vw, 1240px"&gt;<figcaption class="wp-element-caption"><p>Patricia Pichardo, Duracell</p>
</figcaption></figure><p class="imageCredit">Duracell</p></div>



<p class="wp-block-paragraph">Duracell is a manufacturer and marketer of high-performance alkaline batteries, lithium coins, rechargeable batteries, and other specialty cells. Pichardo held previous roles as head of IT PMX for TE Connectivity; director, IT business solutions for McCormick &amp; Company; and IT director, global IT business operations for Stanley Black &amp; Decker. Pichardo holds a BS from the University of Arizona and an MBA from Johns Hopkins University.</p>



<p class="wp-block-paragraph"><strong>Feed the Children announces Stephen Murray as CIO</strong></p>


<div class="extendedBlock-wrapper block-coreImage left"><figure class="wp-block-image alignleft size-1240-r3:2 is-resized"> width="1240" height="698" sizes="auto, (max-width: 1240px) 100vw, 1240px"&gt;<figcaption class="wp-element-caption"><p>Stephen Murray, Feed the Children</p>
</figcaption></figure><p class="imageCredit">Feed the Children</p></div>



<p class="wp-block-paragraph">Feed the Children is a global movement focused on ending childhood hunger in the US and globally. Working alongside communities, it provides food, essentials, and opportunities to children and families who need them most. Prior to joining, Murray held senior tech leadership roles across complex global organizations in manufacturing, media and entertainment, agriculture, and consumer products, including CIO at Cohere Beauty and leadership roles supporting The Walt Disney Company through Atos, as well as positions at The Mosaic Company and Cargill. He holds a BS from SMC University, a CIO MBA from Boston University, and an executive MBA from Rutgers University.</p>



<p class="wp-block-paragraph"><strong>Tracy Weber appointed CIO at Notre Dame</strong></p>


<div class="extendedBlock-wrapper block-coreImage left"><figure class="wp-block-image alignleft size-1240-r3:2 is-resized"> width="1240" height="698" sizes="auto, (max-width: 1240px) 100vw, 1240px"&gt;<figcaption class="wp-element-caption"><p>Tracy Weber, Notre Dame</p>
</figcaption></figure><p class="imageCredit">Notre Dame</p></div>



<p class="wp-block-paragraph">The University of Notre Dame is a global Catholic research university founded in 1842. In her career with Notre Dame, Weber has advanced through several leadership roles spanning many areas of IT, including applications development, enterprise content management, platform services, collaborative IT services, and community IT experience. She holds a BA and EMNA from the University of Notre Dame.</p>



<p class="wp-block-paragraph"><strong>James Watson joins Perry Homes as CIO</strong></p>


<div class="extendedBlock-wrapper block-coreImage left"><figure class="wp-block-image alignleft size-1240-r3:2 is-resized"> width="1240" height="698" sizes="auto, (max-width: 1240px) 100vw, 1240px"&gt;<figcaption class="wp-element-caption"><p>James Watson, Perry Homes</p>
</figcaption></figure><p class="imageCredit">Perry Homes</p></div>



<p class="wp-block-paragraph">Family-owned and operated since 1967, Perry Homes is a woman-owned homebuilder that offers a wide selection of new home designs. Watson most recently served as CIO for Bigge Crane and Rigging, and held prior CIO roles at Total Safety US and Situs. He has a BS and an MBA from the University of Houston – Clear Lake.</p>



<p class="wp-block-paragraph"><strong>Luminis Health welcomes Erica Moncrief as CIO</strong></p>


<div class="extendedBlock-wrapper block-coreImage left"><figure class="wp-block-image alignleft size-1240-r3:2 is-resized"> width="1240" height="698" sizes="auto, (max-width: 1240px) 100vw, 1240px"&gt;<figcaption class="wp-element-caption"><p>Erica Moncrief, Luminis Health</p>
</figcaption></figure><p class="imageCredit">Luminis Health</p></div>



<p class="wp-block-paragraph">Luminis Health is a nonprofit regional health system. Most recently, Moncrief served as VP of IT at Adena Health System, where she provided leadership across all IT functions supporting more than 5,000 employees, 500 physicians, four hospitals, and six regional clinics. She held prior roles at Cardinal Health, InXite Health Systems, and OhioHealth. She holds a BS and MS from Ohio State University.</p>



<p class="wp-block-paragraph"><strong>Daniel Curling joins Lanter Delivery Systems as CIO</strong></p>


<div class="extendedBlock-wrapper block-coreImage left"><figure class="wp-block-image alignleft size-1240-r3:2 is-resized"> width="1240" height="698" sizes="auto, (max-width: 1240px) 100vw, 1240px"&gt;<figcaption class="wp-element-caption"><p>Daniel Curling, Lanter Delivery Systems</p>
</figcaption></figure><p class="imageCredit">Lanter</p></div>



<p class="wp-block-paragraph">Lanter Delivery Systems arranges daily deliveries for essential industries and world-class companies across North America. Most recently, Curling served as CTO for WWEX Group. Prior to that, he was CTO for Experian Health where he led a team of 350 responsible for all tech teams including application development, cloud engineering, DevOps, quality assurance, site reliability engineering, cybersecurity, enterprise architecture, and portfolio management. Curling holds a BS from Texas A&amp;M University.</p>



<p class="wp-block-paragraph"><strong>Piotr Zima named CIO for Cepheid</strong></p>


<div class="extendedBlock-wrapper block-coreImage left"><figure class="wp-block-image alignleft size-1240-r3:2 is-resized"> width="1240" height="698" sizes="auto, (max-width: 1240px) 100vw, 1240px"&gt;<figcaption class="wp-element-caption"><p>Piotr Zima, Cepheid</p>
</figcaption></figure><p class="imageCredit">Cepheid</p></div>



<p class="wp-block-paragraph">Cepheid is a wholly-owned subsidiary of Danaher Corporation specializing in molecular diagnostics. Most recently, Zima served as VP and CIO at Integrated DNA Technologies, another Danaher operating company. Earlier in his Danaher career, he was chief data and analytics officer at Danaher Corporation and head of data, analytics, and finance IT at Cytiva. Zima holds a BS from Cracow University of Technology, and an MBA from Oxford Brookes University.</p>



<p class="wp-block-paragraph"><strong>Acentra Health appoints Michael Kingston as CDIO</strong></p>


<div class="extendedBlock-wrapper block-coreImage left"><figure class="wp-block-image alignleft size-1240-r3:2 is-resized"> width="1240" height="698" sizes="auto, (max-width: 1240px) 100vw, 1240px"&gt;<figcaption class="wp-element-caption"><p>Michael Kingston, Acentra</p>
</figcaption></figure><p class="imageCredit">Acentra</p></div>



<p class="wp-block-paragraph">Acentra Health is a technology and health solutions company dedicated to accelerating better health outcomes for government and commercial clients, and the populations they serve. Kingston most recently served as MD, Portfolio CIO Americas for The Carlyle Group, where he drove tech-enabled value creation for portfolio companies. Prior to Carlyle, Kingston held senior tech leadership positions with several globally recognized brands, including L’Oréal, Neiman Marcus, Coach, Ann Inc., and LVMH. Hold a BS from William Paterson University.</p>



<h2 class="wp-block-heading">New CIO appointments, July 2026</h2>



<p class="wp-block-paragraph"><strong>FirstEnergy names Daniel Puscas as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Eric Tagliere joins R1 as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Geisinger welcomes Bill Bellando as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Wasif Jamal joins WellSpan Health as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Cumberland Farms taps Michael Verdesca as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Teradata names Josh Fecteau as CDAO and CIO</strong></p>



<p class="wp-block-paragraph"><strong>Karen Higgins-Carter announced as CITO for Kroll</strong></p>



<p class="wp-block-paragraph"><strong>Jon Whiley joins TRG as CIO</strong></p>



<p class="wp-block-paragraph"><strong>PowerGrid Services welcomes Brad Manning as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Anguel Lindarev appointed CIO for WesBanco</strong></p>



<p class="wp-block-paragraph"><strong>John Trchala named CTO at eIVF</strong></p>



<h2 class="wp-block-heading">New CIO appointments, June 2026</h2>



<p class="wp-block-paragraph"><strong>Citi appoints Brian Saluzzo as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Imran Jalozie named CIO for Arch Insurance North America</strong></p>



<p class="wp-block-paragraph"><strong>Diebold Nixdorf welcomes Raj Singh as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Jay Spears joins Topgolf as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Crown Castle taps Mark Lennon for CIO</strong></p>



<p class="wp-block-paragraph"><strong>Jim Maza announced as CIO for BDO USA</strong></p>



<p class="wp-block-paragraph"><strong>TDS appoints Bill Case CIO</strong></p>



<p class="wp-block-paragraph"><strong>Viral Tripathi named CIO for Diversified</strong></p>



<p class="wp-block-paragraph"><strong>Consumer Cellular appoints Kannan Alagappan as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Nadene McKenzie-Reid joins Aircastle as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Northwest Bank hires Chad Ballard as CIO</strong></p>



<h2 class="wp-block-heading">New CIO appointments, May 2026</h2>



<p class="wp-block-paragraph"><strong>Chuck Jones joins Northrop Grumman as CIDO</strong></p>



<p class="wp-block-paragraph"><strong>McDonald’s names Mustafa Husain CIO</strong></p>



<p class="wp-block-paragraph"><strong>Turner Construction appoints Dawn Paquette as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Autodesk names Mike Kelly CIO</strong></p>



<p class="wp-block-paragraph"><strong>Memorial Hermann Health System appoints Desiree Gandrup-Dupre CIO</strong></p>



<p class="wp-block-paragraph"><strong>Dycom names Regina Salazar as CIDO</strong></p>



<p class="wp-block-paragraph"><strong>Todd Treonze joins J.Jill as SVP and CIO</strong></p>



<p class="wp-block-paragraph"><strong>V2X names Mike Uster CIO</strong></p>



<p class="wp-block-paragraph"><strong>Horizon Services welcomes John Souther as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Craig Richardville appointed CDIO for UF Health</strong></p>



<p class="wp-block-paragraph"><strong>Pep Boys welcomes Nik Umrani as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Peter Scavuzzo elevated to CITO at CBIZ</strong></p>



<p class="wp-block-paragraph"><strong>ePlus promotes David Mellor to CIO</strong></p>



<p class="wp-block-paragraph"><strong>Julie Irish named CIO for Alteryx</strong></p>



<p class="wp-block-paragraph"><strong>AVI-SPL welcomes Doug King as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Chris Stori joins Verkada as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Exostar promotes Amy Hogan to CIO</strong></p>



<h2 class="wp-block-heading">New CIO appointments, April 2026</h2>



<p class="wp-block-paragraph"><strong>Albertsons Companies appoints Brian Rice to board of directors</strong></p>



<p class="wp-block-paragraph"><strong>Francesco Tinto joins Kimberly-Clark as CIO</strong></p>



<p class="wp-block-paragraph"><strong>University of Pennsylvania names Joshua Beeman CIO</strong></p>



<p class="wp-block-paragraph"><strong>Jim Connolly joins Legacy Food Group as CIO</strong></p>



<p class="wp-block-paragraph"><strong>AGCO appoints Jena Holtberg-Benge as CDIO</strong></p>



<p class="wp-block-paragraph"><strong>Ryan Biren promoted to CIO for THOR Industries</strong></p>



<p class="wp-block-paragraph"><strong>Genworth welcomes Morris Taylor as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Barninder Khurana joins Patriot Growth as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Prashant Lamba announced as CIO for RGP</strong></p>



<h2 class="wp-block-heading">New CIO appointments, March 2026</h2>



<p class="wp-block-paragraph"><strong>USAA names Dan Griffiths as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Dori Henderson joins Brown &amp; Brown as CITO</strong></p>



<p class="wp-block-paragraph"><strong>Bob Hardester named CIO for Advantage Solutions</strong></p>



<p class="wp-block-paragraph"><strong>Skadden adds Vince DiMascio as CDIO</strong></p>



<p class="wp-block-paragraph"><strong>Chris Hickok appointed CIO for Messer Construction Co.</strong></p>



<p class="wp-block-paragraph"><strong>Stormont Vail Health appoints Aaron Wootton as CIO</strong></p>



<p class="wp-block-paragraph"><strong>TowneBank welcomes Varun Chandhok as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Todd Paladini joins Freddy’s Frozen Custard &amp; Steakburgers as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Optiv promotes Doug Goehl to CIO</strong></p>



<p class="wp-block-paragraph"><strong>Brad Rohrer joins the University of Iowa as CIO</strong></p>



<p class="wp-block-paragraph"><strong>Morongo appoints Tony Gawne as CIO</strong></p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[36.000 Euro für einen PC: Was die Höllenmaschine 7 so besonders machte]]></title>
<description><![CDATA[PC-WELT feiert 20 Jahre Höllenmaschine. Diese Woche werfen wir einen Blick zurück auf die Höllenmaschine 7, bei der wir uns auf das Wesentliche konzentrierten: maximale Rechenleistung durch optimale Kühlung. Deshalb gab es 2016 auch nur ein einziges Hauptsystem, dem wir das Rechner-Design unteror...]]></description>
<link>https://tsecurity.de/de/3715111/it-nachrichten/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3715111/it-nachrichten/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/</guid>
<pubDate>Thu, 13 Aug 2026 16:30:15 +0200</pubDate>
<content:encoded><![CDATA[<div>
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>



<p>PC-WELT feiert 20 Jahre Höllenmaschine. Diese Woche werfen wir einen Blick zurück auf die Höllenmaschine 7, bei der wir uns auf das Wesentliche konzentrierten: maximale Rechenleistung durch optimale Kühlung. Deshalb gab es 2016 auch nur ein einziges Hauptsystem, dem wir das Rechner-Design unterordneten. Rund um die Höllenmaschine 7 haben wir 55 Videos produziert, die Sie alle in dieser <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">YouTube-Playlist</a> finden.</p>



<p>Hier geht es direkt zum <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">Gewinnspiel der aktuellen Höllenmaschine HMX 6 im Gesamtwert von 40.000 Euro</a>. Bestens informiert bleiben Sie mit unserem <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">HMX-6-Newsletter</a> – aber vergessen Sie nicht, die Anmeldung via E-Mail zu bestätigen. Und nun viel Spaß mit der Höllenmaschine 7:</p>



<p>Auf das beliebte Eco-System wollen wir bei der Höllenmaschine 7 nicht verzichten. Das haben wir in den Mini-PC Zotac Zbox SN970 NEN ausgelagert. Und natürlich schnüren wir auch wieder standesgemäße Peripherie- und Software-Pakete, sodass der Gesamtwert der Höllenmaschine 7 mit fast 36.000 Euro einen neuen Rekord aufstellt! </p>



<p>Zu den Hardware-Highlights gehört der Profi-Monitor <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">Eizo ColorEdge CG318-4K</a>, der allein schon fast 5000 Euro kostet. Und mit den Programm-Paketen Adobe Creative Cloud, Maxon Cinema 4D und Microsoft Visual Studio Pro gibt es für das 4K-Display auch gleich adäquates Futter im Wert von fast 6000 Euro on top.</p>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure data-wp-context='{"imageId":"6a7dd4ebec83c"}' data-wp-interactive="core/image" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on-async--click="actions.showLightbox" data-wp-on-async--load="callbacks.setButtonStyles" data-wp-on-async-window--resize="callbacks.setButtonStyles" src="https://b2c-contenthub.com/wp-content/uploads/2026/08/Gaming-Display-der-Hollenmaschine-7.jpg?quality=50&amp;strip=all" alt="Die Gaming-Displays der Höllenmaschine 7" class="wp-image-3210508" width="840" height="473" loading="lazy"><button class="lightbox-trigger" type="button" aria-haspopup="dialog" aria-label="Enlarge" data-wp-init="callbacks.initTriggerButton" data-wp-on-async--click="actions.showLightbox" data-wp-style--right="state.imageButtonRight" data-wp-style--top="state.imageButtonTop">
				<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewbox="0 0 12 12">
					<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z"></path>
				</svg>
			</button></figure><p class="imageCredit">PC-WELT</p></div>



<p>Selbstverständlich feiern wir auch bei der 7. Generation Technik-Premieren und verbauen Prototypen, die es (noch) nicht zu kaufen gibt. In die Kategorie Technik-Innovation fallen etwa die drei Gaming-Displays <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">Asus ROG Swift PG279Q</a> mit 165 Hertz Bildwiederholfrequenz und die blitzschnelle M2-SSD <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">Samsung 950 Pro</a> mit NVM-Express-Anschluss, während mit dem <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">Seasonic SS-1200XP3 Snow Silent HM07 Edition</a> ein Netzteil-Unikat verbaut ist.</p>



<h2 class="wp-block-heading toc">Grafikkarte: 3 980 Ti</h2>



<p>Auch die Höllenmaschine 7 setzt wieder auf Nvidia-Grafikprozessoren und einen 3-Way-SLI-Verbund. Dieses Jahr stellt Zotac die Grafikkarten zur Verfügung. Dabei handelt es sich um das bereits ab Werk übertaktete Modell Zotac Geforce GTX 980 Ti AMP!. Der Grafikprozessor läuft mit einem Chiptakt von 1051 MHz und kann im Boost-Modus auf bis zu 1140 MHz hochdrehen. In der Höllenmaschine 7 haben wir den GPU-Takt stabil auf 1380 MHz hochgeprügelt.</p>



<p>Die Rechenkraft von rund 6000 Gigaflops schöpft der Grafikchip aus 2816 Shader-, 176 Textur- und 96 Rasteroperations-Einheiten. Je Grafikkarte stehen 6 GB GDDR5-Speicher zur Verfügung, die über ein 384 Bit breites Interface angebunden sind. Mit einem Werks-Speichertakt von effektiv 7010 MHz ergibt sich ein Durchsatz von 336 GB/s. In der Höllenmaschine 7 haben wir den Speichertakt mit 7500 MHz noch einen Tick zusätzlich anheben können.</p>



<p>Die Leistungsaufnahme der Zotac Geforce GTX 980 Ti AMP! bewegt sich mit den Werks-Frequenzen zwischen 13 und rund 250 Watt. Bei den in der Höllenmaschine 7 stark übertakteten Grafikkarten kann der Stromverbrauch auf bis zu 300 Watt ansteigen. Neben DirectX 12 (Feature-Level 12-1) beherrscht der Grafikchip auch OpenGL 4.5, OpenCL 1.2 und das Shader-Modell 5.0. Hinzu kommen Nvidia-Techniken wie 3D Vision, 3D Vision Surround, CUDA, DSR, G-Sync, Hairworks, PhysX, SLI sowie VR Technologie.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>Ab Werk liefert Zotac die Grafikkarten mit einem Aluminiumkühlkörper mit Kupfer-Heatpipes aus, dem drei 90-Millimeter-Axial-Lüfter frische Luft zufächeln. In der Höllenmaschine 7 ersetzen wir die IceStorm-Kühllösung durch einen Wasserkühlungsblock. Mit fünf Videoausgängen, davon 3x DisplayPort 1.2 sowie je 1x DL-DVI und HDMI 2.0, zeigt sich das Zotac-Modell maximal flexibel.</p>



<h2 class="wp-block-heading toc">CPU: Core i7-5960X EE</h2>



<p>Asus sponsert auch gleich noch die CPU der Höllenmaschine 7. Es ist dasselbe Modell, das auch schon in der 6. Generation zum Einsatz kam: der Core i7-5960X – nach wie vor der rechenstärkste Desktop-Prozessor auf dem Markt. Die CPU arbeitet mit der Technik Hyper-Threading als virtueller 16-Kern-Prozessor. Der CPU-Werkstakt liegt bei 3 Gigahertz. Es versteht sich von selbst, dass wir dem Octa-Core mithilfe einer professionellen Wasserkühlung von Aquatuning deutlich mehr Leistung entlocken. In der Höllenmaschine 7 läuft der Prozessor mit 4,4 Gigahertz.</p>



<p>Berechnungen puffert das Core-i7-Modell in einem dreistufigen Cache-System. Auf die erste und zweite Cache-Stufe mit 64 beziehungsweise 256 KB darf jeder CPU-Kern exklusiv zugreifen, den gemeinsamen, 20 MB mächtigen Smart-Cache nutzen die 8 Kerne dynamisch. Die CPU besitzt vierzig PCI-Express-3.0-Kanäle für die direkte Anbindung von Grafikkarten. Bei einer Triple-SLI-Konfiguration würden sich also nur zwei Karten mit 16-facher und eine Karte mit 8-facher Geschwindigkeit ansteuern lassen. Deswegen haben wir als Mainboard das Asus X99-E gewählt, das zusätzliche PCI-Express-3.0-Kanäle mitbringt und so sogar bis zu fünf 16x-PCI-Express-Karten mit vollem Tempo ansteuern könnte.</p>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure data-wp-context='{"imageId":"6a7dd4ebed57b"}' data-wp-interactive="core/image" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on-async--click="actions.showLightbox" data-wp-on-async--load="callbacks.setButtonStyles" data-wp-on-async-window--resize="callbacks.setButtonStyles" src="https://b2c-contenthub.com/wp-content/uploads/2026/08/Intel-Core-i7-5960X-Der-Prozessor-der-Hollenmaschine-7.jpg?quality=50&amp;strip=all" alt="Intel Core i7-5960X: Der Prozessor der Höllenmaschine 7" class="wp-image-3210512" width="840" height="473" loading="lazy"><button class="lightbox-trigger" type="button" aria-haspopup="dialog" aria-label="Enlarge" data-wp-init="callbacks.initTriggerButton" data-wp-on-async--click="actions.showLightbox" data-wp-style--right="state.imageButtonRight" data-wp-style--top="state.imageButtonTop">
				<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewbox="0 0 12 12">
					<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z"></path>
				</svg>
			</button><figcaption class="wp-element-caption">Asus stellte  die CPU und das Mainboard der Höllenmaschine 7</figcaption></figure><p class="imageCredit">PC-WELT</p></div>



<p>Der Core i7-5960X steuert bis zu acht DDR4-Speicherbänke auf der Hauptplatine direkt über seinen Vierkanal-Controller an. Die CPU ist zwar offiziell nur für 64 GB Speicher ausgelegt, dank des aufgebohrten Asus-Mainboards kommt der Prozessor aber auch mit der doppelten Menge an DDR4-RAM zurecht. Zur weiteren Ausstattung der CPU gehören der Schutz vor Angriffen durch einen Puffer-Überlauf (XD-Bit), zusätzliche Befehlssätze wie AVX2, FMA, SSE 4.2 und TSX. Zudem unterstützt der Prozessor 32- und 64-Bit-Betriebssysteme sowie die Virtualisierungs-Technik.</p>



<h2 class="wp-block-heading toc">RAM: 128 GB DDR4</h2>



<p>Speicher-Spezialist Kingston rüstet die Höllenmaschine 7 für rund 1100 Euro mit 128 GB Arbeitsspeicher aus. Die acht Module stammen aus der Serie HyperX Savage und laufen mit einem effektiven Takt von 2666 MHz. Da bei DDR4-SDRAM der Controller jedes Modul einzeln ansteuern kann, summiert sich die theoretische Speicherbandbreite der Höllenmaschine 6 auf 170 GB/s! Trotz des höheren Datendurchsatzes sinkt bei DDR4-Speicher die Leistungsaufnahme. Das hat mehrere Gründe:</p>



<p>Statt 1,5 Volt liegt die Versorgungsspannung in den RAM-Steckplätzen nun bei 1,2 Volt. Zusätzlich arbeitet DDR4-Speicher energieeffizienter, weil er seine Auffrischungsrate dynamisch je nach Bedarf durchführen kann – bei DDR3-Modulen geschieht das in fest vorgegebenen Intervallen. Dank dieser beiden Faktoren verbraucht DDR4-Speicher bis zu 40 Prozent weniger Energie.</p>



<p>Natürlich unterstützt der Arbeitsspeicher von Kingston auch die Technik eXtreme Memory Profile (XMP). Mithilfe von XMP lassen sich im UEFI der Hauptplatine bereits gespeicherte Übertaktungs-Profile wählen, die für die RAM-Riegel nach einem Neustart automatisch übernommen werden. Das Mainboard der Höllenmaschine 7 erlaubt selbstredend auch das manuelle Übertakten des Arbeitsspeichers.</p>



<h3 class="wp-block-heading toc">Ausstattung und Preise</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Komponente</td><td><strong>Modell</strong></td><td><strong>Preis [Euro]</strong> vom 9.3.2016</td></tr><tr><td>Gehäuse</td><td>Caselabs Magnum STH10</td><td>1200</td></tr><tr><td>Hauptplatine</td><td>Asus X99-E WS/USB 3.1</td><td>500</td></tr><tr><td>Prozessor</td><td>Intel Core i7-5960X</td><td>1100</td></tr><tr><td>Arbeitsspeicher</td><td>Kingston HyperX Savage Kit 128GB, DDR4-2666</td><td>1100</td></tr><tr><td>Grafikkarten</td><td>3x Zotac GTX 980 Ti AMP! 6 GB GDDR5</td><td>2100</td></tr><tr><td>Creative-Display</td><td>Eizo ColorEdge CG318-4K</td><td>5000</td></tr><tr><td>Gaming-Display</td><td>3x Asus ROG Swift PG279Q, G-Sync, 165 Hz</td><td>2550</td></tr><tr><td>Triple-Display-Halterung</td><td>Trading-PC Monitorträgersystem III Widescreen</td><td>600</td></tr><tr><td>System-SSD</td><td>Samsung SSD 950 Pro 512GB NVMe M.2</td><td>320</td></tr><tr><td>Massenspeicher I</td><td>4x Samsung SSD 850 Pro 2TB</td><td>3600</td></tr><tr><td>Massenspeicher II</td><td>6x Toshiba X300 High-Performance 6TB</td><td>1500</td></tr><tr><td>NAS</td><td>Qnap Turbo Station TS-451+-8G 24TB</td><td>1750</td></tr><tr><td>Blu-ray-Brenner</td><td>Asus BW-16D1HT + Asus 16D1H-U PRO</td><td>230</td></tr><tr><td>Funknetzwerk</td><td>Asus RT-AC5300 und Asus RP-AC68U</td><td>600</td></tr><tr><td>Soundkarte</td><td>Asus Xonar Essence STX II 7.1</td><td>250</td></tr><tr><td>Netzteil</td><td>Seasonic SS-1200XP3 Snow Silent HM07 Edition</td><td>400</td></tr><tr><td>Kühlung &amp; Licht</td><td>Aquatuning Komplettpaket</td><td>2500</td></tr><tr><td>Lautsprecher-Set</td><td>Teufel Concept E 450 Digital</td><td>450</td></tr><tr><td>Maus</td><td>Roccat Nyth + Apuri + Taito Control</td><td>190</td></tr><tr><td>Tastatur</td><td>Roccat Ryos MK FX + Into + Aluma</td><td>290</td></tr><tr><td>Headset</td><td>Beyerdynamic MMX 300 Manufaktur</td><td>360</td></tr><tr><td>Mikrofon</td><td>Beyerdynamic MCE 85 BA Full Camera Kit</td><td>380</td></tr><tr><td>Eco-System</td><td>Zotac Zbox SN970 NEN</td><td>1200</td></tr><tr><td>Gaming Chair</td><td>Vertagear Racing VG-SL4000</td><td>300</td></tr><tr><td>Betriebssystem</td><td>2x Microsoft Windows10 Pro 64 Bit</td><td>200</td></tr><tr><td>Office-Paket</td><td>Microsoft Office 365 Home (1 Jahr)</td><td>70</td></tr><tr><td>Developer-Paket</td><td>Microsoft Visual Studio Pro 2015 + MSDN (1 Jahr)</td><td>1500</td></tr><tr><td>Kreativ-Paket I</td><td>Maxon Cinema 4D R17.0 Studio</td><td>3000</td></tr><tr><td>Kreativ-Paket II</td><td>Adobe Creative Cloud mit Adobe Stock (1 Jahr)</td><td>1150</td></tr><tr><td>Spiele-Paket</td><td>Nvidia</td><td>1500</td></tr><tr><td>SUMME</td><td>Gesamtpaket</td><td>35890</td></tr></tbody></table></figure>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>Das Workstation-Motherboard <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">Asus X99-E WS/USB 3.1</a> geizt nicht mit Anschlüssen und Schnittstellen. Sofort ins Auge stechen die sieben x16-PCI-Express-Steckplätze. Alle erfüllen den PCI-E-3.0-Standard, schaffen also bis zu 8 Gigatransfers/s je Kanal und Richtung. Fünf der sieben Steckplätze steuern auch elektrisch alle 16 Kanäle an, sodass alle Grafikkarten mit maximalem Tempo laufen können. Doch auch beim Arbeitsspeicher reizt das Asus X99-E das Maximum aus und erlaubt dank der acht RAM-Bänke den Vollausbau auf bis zu 128 Gigabyte DDR4-Speicher im Vierkanal-Modus – inklusive ECC-Unterstützung.</p>



<p>Für Festplatten stellt das Asus-Board 2x SATA-Express sowie einen M.2-Sockel (2280/2260) zur Verfügung. Der M.2-Anschluss ist über vier PCI-Express-3.0-Lanes angebunden und unterstützt das schnelle NVMe-Protokoll, das Datenraten von bis zu 32 Gigabit/s erlaubt. Dazu kommen ein Dutzend SATA-3-Anschlüsse, wobei sich zehn davon über einen integrierten Raid-Controller in den Modi 0, 1, 5 und 10 anbinden lassen.</p>



<p>Die internen Anschlüsse ergänzen je 4x USB 2.0 und USB 3.0, Thunderbolt 2 AIC, DTS Connect, einen TMP-Header sowie ein Diagnose-LED für den Boot-Vorgang. Das hintere Anschlussfeld des Motherboards bietet 2x USB 3.1 und 8x USB 3.0, 2x Gigabit-LAN, 2x eSATA 6 Gigabit/s sowie 5x Klinke und einen optischen S/PDIF-Ausgang für Audiosignale. Die Anschlussfülle ergänzt ein praktischer „Clear CMOS“-Knopf.</p>



<h2 class="wp-block-heading toc">Caselabs-Gehäuse</h2>



<p>Das vollmodulare Aluminium-Gehäuse Caselabs Magnum STH10 unterteilt sich in drei Kompartimente. In der unteren Kammer lassen sich entweder bis zu zwei Netzteile oder zwei 560er-Radiatoren verbauen. Der Mittelteil besitzt ein extra herausnehmbares Hauptplatinen-Tray, das Mainboards bis zum HPTX-Standard aufnimmt. Daneben bietet das Zentrum des Magnum STH10 viel Platz für diverse Festplattenkäfige oder alternativ den Raum für Ausgleichsbehälter, Pumpe und weitere Radiatoren.</p>



<p>Und im oberen Bereich können Sie vorn bis zu drei 5,25-Zoll-Schächte bestücken, während hinten zwei ATX-Netzteile Platz finden. Mit Abmessungen von 286 x 819 x 675 Millimetern kommt das schwarz lackierte Caselabs-Modell brutto auf 158 Liter Volumen, die wir mit der besten PC-Hardware des laufenden Jahres gefüllt haben.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>Theoretisch wäre im Caselabs Magnum STH10 Platz für bis zu zehn PCI-Express-Karten, siebzehn 5,25-Zoll-Laufwerke, zweiundzwanzig 3,5-Zoll-Festplatten sowie achtundvierzig 2,5-Zoll-SSDs. Großzügig ist auch der Bereich für das Kabelmanagement im Mittelteil ausgelegt. Selbstredend ist das knapp 15 Kilogramm schwere Gehäuse mit einem Glasfenster im Seitenteil ausgestattet. Das Gehäusemonster ist ein exklusiver US-Import und hat inklusive aller Extras einen Gesamtwert von rund 1200 Euro.</p>



<h2 class="wp-block-heading toc">Profi-Bildschirm</h2>



<p>Von Profis für Profis – der Eizo ColorEdge CG318-4K. Das 10-Bit-IPS-Panel mit einer Bilddiagonale von 31,1 Zoll (0,79 Meter) löst mit 4096 x 2160 Pixeln auf. Der Wide-Gamut-Monitor reproduziert den Adobe-RGB- zu 99 und den DCI-P3-Farbraum zu 98 Prozent. Der ColorEdge deckt aber auch den Farbraum des Offsetdrucks ab und erfüllt unter anderem die Normen ISO Coated und U.S. Web Coated.</p>



<p>Dank integrierter Selbstkalibrierung stellt das Eizo-Modell eine maximale Farbgenauigkeit unabhängig von Umgebungseinflüssen über den gesamten Bildschirm sicher. Zeit und Nerven schont dabei die mitgelieferte Hardware-Kalibrierungs-Software ColorNavigator 6, über die Sie wahlweise automatisch oder manuell die Einstellungen vornehmen. Zudem lässt sich auch über das On-Screen-Menü eine vollautomatische Kalibrierung ausführen.</p>



<p>Der 3D Look-Up-Table (3D LUT) sorgt für eine überragend präzise Tonwertzuordnung und Farbtonwiedergabe. Für einen konstanten Tonwert über den gesamten Bildschirm sorgt der Digital Uniformity Equalizer (DUE). Die DUE-Funktion gleicht auch die Auswirkungen von Schwankungen der Umgebungstemperatur auf Farbtemperatur und Helligkeit aus – das garantiert eine stets homogene Leuchtdichteverteilung und perfekte Farbreinheit.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>Das hervorragende Kontrastverhältnis des Eizo ColorEdge CG318-4K liegt bei 1.000:1, die Helligkeit beträgt 350 cd/m2 und der Betrachtungswinkel 178 Grad. Die Bildwiederholfrequenz beläuft sich auf 60 Hertz, die Reaktionszeit beträgt 9 Millisekunden. An Anschlüssen stehen je 2x Display Port 1.2 und HDMI zur Verfügung. Dazu gibt’s 3x USB 3.0. Im Lieferumfang enthalten ist eine Lichtschutzblende.</p>



<h2 class="wp-block-heading toc">Gaming-Display</h2>



<p>Für ernsthafte PC-Spieler ist der Asus ROG Swift PG279Q konzipiert: Dank der Integration von Nvidia G-Sync gehören störende Ruckler, Input-Latenzen sowie hässliches Einzelbild-Zerreißen der Vergangenheit an, denn das kleine Hardware-Modul synchronisiert die Bildwiederholfrequenz direkt mit dem Grafikprozessor, um ein stets flüssiges Spielerlebnis zu bieten.</p>



<p>Dazu gibt es eine beeindruckend schnelle Bildwiederholrate von 165 Hertz und die Reaktionszeit (grau zu grau) beträgt auch nur 4 Millisekunden. Der Anschluss erfolgt über DisplayPort 1.2 und HDMI 1.4, außerdem stehen noch eine Kopfhörer- und zwei USB-3.0-Buchsen zur Verfügung.</p>



<p>Durch die Technik „GamePlus“ erweitert Asus das Gaming-Vergnügen dank Fadenkreuz-Overlays für Egoshooter sowie In-Game-Timer für RTS/MOBA-Spiele (Real Time Strategy/Multiplayer Online Battle Arena). Für eine möglichst naturgetreue Wiedergabe reduziert der 27-Zoll-Monitor Unschärfe-Effekte bei schnellen Bewegungen.</p>



<p>Das IPS-Panel arbeitet mit einer Auflösung von 2560 x 1440 Bildpunkten. Das ausgezeichnete Kontrastverhältnis liegt bei 1.000:1, die Helligkeit beträgt 350 cd/m2, der Betrachtungswinkel 178 Grad. Der flexible Standfuß erlaubt nicht nur die Pivotfunktion, sondern auch das flexible Verstellen in Höhe und Winkel. Der Bildschirm hat einen schlanken 6-mm-Rahmen – ideal für die Multi-Monitor-Konfiguration der Höllenmaschine 7, die drei Asus ROG Swift PG279Q gleichzeitig ansteuert.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>Damit das Gaming-Display der Höllenmaschine 7 – bestehend aus drei Asus ROG Swift PG279Q – auch optimal in einer Bildschirmfläche vereint ist, haben wir das Monitor-Trio gleich fest im Monitorträgersystem III Widescreen von Trading-PC.com montiert. Der Bildschirm-Ständer ist für drei Monitore im 16:9- und 16:10-Format bis zu einer Bilddiagonalen von 32 Zoll geeignet.</p>



<p>Voraussetzung für alle Displays, die im Trägersystem Platz nehmen wollen, ist eine VESA-Monitorhalterung, da die Befestigung am Trägersystem über diesen genormten Montageplatz erfolgt. Die sehr stabile Metall-Aluminium-Konstruktion trägt Bildschirme bis zu einem Gewicht von jeweils 15 Kilogramm. Zudem haben Sie die Wahl zwischen einer geraden und einer parabolisch geformten Aufhängungsschiene – für die Asus-Monitore der Höllenmaschine 7 haben wir uns für letztere Variante entschieden.</p>



<p>Im Monitorträgersystem III Widescreen lässt sich jeder montierte Monitor horizontal und vertikal stufenlos einstellen. So können Sie jederzeit die optimale Höhe, den Blickwinkel sowie den Sehabstand regulieren. Das pulverbeschichtete Trägersystem lässt sich in vertikaler und horizontaler Ebene nachträglich erweitern. So können Sie beispielsweise noch drei zusätzliche Monitore über dem bereits montierten Trio anbringen. Auf die in Deutschland gefertigten Monitorträgersysteme gewährt Trading-PC.com fünf Jahre Garantie und Nachlieferungsservice. Das für die Höllenmaschine 7 ausgewählte System kostet rund 600 Euro.</p>



<h2 class="wp-block-heading toc">System-SSD</h2>



<p>Kleine SSD ganz groß: Die nur 2,4 Millimeter dünne Samsung SSD 950 Pro 512 GB im Steckkartenformat M.2 2280 nimmt lediglich eine Fläche von 80 x 22 Millimetern ein. Das Solid-State-Modul von Samsung bietet dank NVMe-Protokoll und Anbindung via PCI-Express 3.0 x4 das Tempo von ausgewachsenen Raid-0-Verbunden:</p>



<p>Mit einem Befehlsdurchsatz von bis zu 300 000 IOPS beim Lesen von 4K-Blöcken sowie bis zu 110 000 IOPS beim Schreiben stellt das NVMe-Modell so manche Enterprise-SSDs in den Schatten. Aber auch die Datenraten von bis zu 2500 MB/s beim sequenziellen Lesen und 1500 MB/s beim Schreiben fallen extrem hoch aus. Zum Vergleich: Damit ist die Samsung 950 Pro drei- bis fünfmal so schnell unterwegs wie die besten SATA-SSDs.</p>



<p>Bei der Samsung SSD 950 Pro kombiniert Samsung den hauseigenen 8-Kanal-Controller UBX mit 3D-Flashspeicher und einem 512 MB großen Cache-Chip. Die Gesamt-Schreibleistung des Moduls liegt bei 400 Terabyte, die MTBF bei 1,5 Millionen Stunden. Die M.2-SSD schützt die gespeicherten Daten automatisch per 256-Bit-AES-Verschlüsselung oder per Verwaltungs-Software über den TCG-Standard Opal 2.0.</p>



<h2 class="wp-block-heading toc">SSD-Speicher</h2>



<p>Da die System-SSD Samsung 950 Pro mit 512 Gigabyte nicht so üppig viel Speicherplatz besitzt, verbauen wir in der Höllenmaschine 7 noch vier SATA-3-SSDs. Dieses SSD-Quartett bildet den primären Massenspeicher unseres Traumrechners und besteht aus vier Samsung SSD 850 Pro mit jeweils 2 Terabyte Kapazität. Stückpreis der 2-TB-Modelle: rund 850 Euro.</p>



<p>In unserem Test war die Samsung 850 Pro 2 TB das bisher schnellste SATA-3-Modell. Das Transfertempo der Samsung-SSD kann beim Lesen sequenziell bis zu 550 MB/s erreichen, der Befehlsdurchsatz liegt bei rund 100.000 IOPS. Das Schreibtempo liegt bei maximal 520 MB/s, die IOPS-Leistung erreicht hier bis zu 90.000 Befehle/s.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>Doch damit geben wir uns natürlich nicht zufrieden, denn in der Höllenmaschine 7 ist das SSD-Quartett über einen Raid-Controller für maximales Tempo und maximale Datensicherheit zu einem Verbund im Raid 10 konfiguriert. Die Gesamt-Schreibleistung der Samsung 850 Pro beträgt 300 Terabyte und die MTBF 2 Millionen Stunden. Außergewöhnlich gut ist aber auch die lange Garantiezeit von 10 Jahren. Das SSD-Quartett hat einen Gesamtwert von 3400 Euro.</p>



<h2 class="wp-block-heading toc">HDD-Speicher</h2>



<p>Mehr Speicherplatz ist nie verkehrt. Deswegen braucht die Höllenmaschine 7 neben der System-SSD und dem primären SSD-Massenspeicher natürlich auch noch Platz für gigantische Datenmengen wie die private Foto-, Musik-, Spiele- und Video-Sammlung. Und Profi-Kreative schätzen großzügige Speicherreserven für Druck-, Fotografie- und Film-Projekte. Das haben wir uns auch gedacht und der Höllenmaschine 7 einen zweiten Massenspeicher in Form von schnellen 3,5-Zoll-Festplatten verordnet.</p>



<p>Diesen Job übernehmen sechs Toshiba X300 High-Performance mit jeweils 6 TB. Zwei der Laufwerke sind fest verbaut, die restlichen vier Toshiba-Festplatten können Sie flexibel über einen Hot-Swap-Schacht in der Gehäusefront der Höllenmaschine 7 an- und abstöpseln. Damit die Scheibendreher nicht unnötig Strom verbrauchen und den Lärmpegel in die Höhe treiben, springen die Spindelmotoren nur an, wenn man auf die Laufwerke zugreift.</p>



<p>Aufgrund des hohen Rotationstempos sind die Toshiba-Festplatten für eine extreme Leistung ausgelegt. Die 3,5-Zoll-Modelle arbeiten mit rasanten 7200 Umdrehungen pro Minute und erreichen so sequenzielle Datenraten von bis zu 200 MB/s. Damit Programme die Toshiba X300 High-Performance nicht ausbremsen, ist der Pufferspeicher mit 128 MB sehr großzügig bemessen. Die sechs Festplatten haben einen Gesamtwert von fast 1500 Euro.</p>



<h2 class="wp-block-heading toc">NAS</h2>



<p>Die Qnap Turbo Station TS-451+-8G ist der Netzwerkspeicher der Höllenmaschine 7. Das NAS ist bestückt mit vier 3,5-Zoll-Festplatten des Typs HGST Deskstar NAS 6 TB. Damit bietet das Qnap-Modell eine Speicherkapazität von bis zu 24 Terabyte. Der Netzwerkspeicher von Qnap erlaubt den Hot-Swap-Betrieb und unterstützt die Raid-Modi 0, 1, 5, 6, 10 sowie JBOD. Die Turbo Station treibt der Celeron J1900 an, der die Virtualization Technology beherrscht.</p>



<p>Dadurch können Sie mithilfe der Software Qnap Virtualization Station zusätzlich zum QTS-Betriebssystem auf Linux-Basis virtuelle Maschinen installieren – so lässt sich jede beliebige Software auf dem Netzwerkspeicher ausführen. Für maximale Leistung im virtuellen Betriebsmodus sorgt dabei die volle RAM-Ausbaustufe von 8 GB.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>Qnap bietet fast ein Dutzend Apps für den mobilen Zugriff auf die Turbo Station für Android, iOS und Windows an. Mit den Apps können Sie unter anderem Ihre Daten durchsuchen und verwalten, das NAS konfigurieren, überwachen und steuern sowie Ihre Foto-, Musik- und Videosammlung abrufen und teilen. Über 200 Apps, die Sie direkt auf dem Netzwerkspeicher ausführen können, hält das App-Center bereit.</p>



<p>Das Qnap-Gerät lässt sich als FTP- und iTunes-Server sowie Filesharing-Client nutzen, streamt Fotos und Videos an DLNA/UPnP-Geräte wie Media-Player, Spiele-Konsolen und TVs und bringt mit myQNAPcloud sogar einen eigenen Cloud-Dienst mit. Zu den Anschlüssen gehören zwei Gigabit-Netzwerke, die im Portbündelungsmodus bis zu 225 MB/s erreichen. Für Drucker, externe Datenträger und WLAN-Sticks stehen je 2x USB 2.0 und USB 3.0 zur Verfügung. Und via HDMI geben Sie Full-HD-Videos inklusive 7.1-Raumklang an A/V-Receiver und TV-Geräte aus.</p>



<p>Der Blu-ray-Brenner der Höllenmaschine 7 ist aufgrund des flotten 16x-BD-Schreibtempos das ideale optische Laufwerk für die Höllenmaschine 7. Das Asus-Modell brennt zudem vierschichtige BDXL-Medien, die bis zu 128 GB speichern, mit 6-facher Geschwindigkeit. Der Brenner beschreibt auf Wunsch aber auch Millennial Disks (M-Disk), die dank einer besonders widerstandsfähigen anorganischen Beschichtung bis zu 1000 Jahre halten sollen.</p>



<p>Der Multi-Norm-Brenner versteht sich aber auch auf alle gängigen CD- und DVD-Formate. DVD-Rohlinge beschreibt der BW-16D1HT mit bis zu 16-fachem Tempo, CDs mit bis zu 48-facher Geschwindigkeit. Selbstredend kann das Asus-Modell dank mitgeliefertem Software-Player auch 3D-Blu-rays abspielen – inklusive Dolby Digital HD und DTS HD für perfekten Raumklang.</p>



<p>Und weil der Brenner so gut ist, spendieren wir der Höllenmaschine 7 auch gleich noch die externe Variante:</p>



<p>Der Asus 16D1H-U PRO kommt zusätzlich mit einem Software-Paket. In dem Paket ist Cyberlink PowerDVD with Magic Cinema enthalten, mit dem beide Laufwerke 3D-Blu-rays abspielen können – inklusive Dolby Digital HD und DTS HD für perfekten Raumklang. Dazu gibt’s das Brennprogramm Cyberlink Power2Go, die Sicherungs-Software Cyberlink PowerBackup und die Paketschreiblösung Cyberlink InstantBurn.</p>



<h2 class="wp-block-heading toc">Netzwerk</h2>



<p>Mit dem Asus-Gespann aus Router und Repeater klinkt sich die Höllenmaschine 7 drahtlos ins Internet ein. Der Asus RT-AC5300 zählt zu den weltweit schnellsten WLAN-Routern dank Triband-Datenübertragung mit bis zu zweimal 2,167 GBit/s über 5 GHz und 1 Mbit/s über 2,4 GHz – kumuliert also satte 5,3 GBit/s. Optimalen Empfang und Signalabdeckung garantieren acht Antennen, die Sie zudem individuell ausrichten können.</p>



<p>Für maximale Übertragungsgeschwindigkeiten sorgt die Technik Tri-Band Smart Connect, die für jedes angemeldete Gerät im Funknetzwerk automatisch das schnellste der drei verfügbaren Frequenzbänder auswählt. An Schnittstellen bringt der rund 450 Euro teure Asus RT-AC5300 viermal Gigabit-Ethernet sowie einmal USB 3.0, etwa zum Anschluss eines Druckers oder Netzwerkspeichers.</p>



<p>Für Gamer interessant ist der integrierte Gaming-Beschleuniger WTFast – eine Art VPN nur für Spieler: Im Gamers Privat Network sucht Euch der Asus RT-AC5300 die beste Route für Eure Datenpakete heraus. So sollen Ping und Paketverluste weiter sinken – Asus verspricht hier Verbesserungen zwischen 60 und 90 Prozent.</p>



<p>Der Repeater Asus RP-AC68U stellt sicher, dass das hohe Tempo auch bei der Höllenmaschine 7 ankommt. Der Repeater besitzt gleich fünf Gigabit-Ethernet-Ports sowie einen USB-3.0-Anschluss und nimmt über vier Antennen Verbindung zum Tri-Band-WLAN-Router auf. Der Gesamtpreis für das Netzwerk-Paket von Asus beträgt rund 600 Euro.</p>



<h2 class="wp-block-heading toc">Soundkarte</h2>



<p>Die Soundkarte Asus Xonar Essence STX II 7.1 ist in der Höllenmaschine 7 für den perfekten Klang zuständig. Dafür sorgen die hochwertigen Bausteine, die auf der PCI-Express-Karte verbaut sind: Herzstück der Hauptkarte ist der Digital-Analog-Wandler PCM1792A von Texas Instruments, der mit einer maximalen Abtastrate von 192 kHz und 24 Bit Sampling-Tiefe arbeitet. Der Signal-Rauschabstand beträgt 120 bis 124 dB.</p>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure data-wp-context='{"imageId":"6a7dd4ebeefe9"}' data-wp-interactive="core/image" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on-async--click="actions.showLightbox" data-wp-on-async--load="callbacks.setButtonStyles" data-wp-on-async-window--resize="callbacks.setButtonStyles" src="https://b2c-contenthub.com/wp-content/uploads/2026/08/Asus-Xonar-Essence-STX-II-7.1.jpg?quality=50&amp;strip=all" alt="Asus Xonar Essence STX II 7.1" class="wp-image-3210548" width="840" height="473" loading="lazy"><button class="lightbox-trigger" type="button" aria-haspopup="dialog" aria-label="Enlarge" data-wp-init="callbacks.initTriggerButton" data-wp-on-async--click="actions.showLightbox" data-wp-style--right="state.imageButtonRight" data-wp-style--top="state.imageButtonTop">
				<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewbox="0 0 12 12">
					<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z"></path>
				</svg>
			</button></figure><p class="imageCredit">ASUS</p></div>



<p>Der Analog-Digital-Wandler Cirrus Logic CS5381 spielt mit einem Dynamikumfang von 120 dB und einem Leistungsvermögen von 192 kHz in 24 Bit ebenfalls auf höchstem Niveau. Von Texas Instruments stammt auch der Kopfhörerverstärker 6120A2, der mit einer Impedanz von 600 Ohm arbeitet. Zudem können Sie mit drei Operationsverstärkern die Klangcharakteristik der Wandler und des Kopfhörerverstärkers individuell anpassen.</p>



<p>Die 7.1-Kanal-Ausgabe erfolgt über die exklusive Tochterplatine, die ebenfalls über einen PCI-Express-Anschluss Verbindung zur Höllenmaschine 7 aufnimmt. Die analogen Ausgänge umfassen 1x Klinke (6,3 mm), 1x Klinke/TOSlink und 8x RCA, dazu gibt’s einen analogen Eingang (6,3-mm-Klinke).</p>



<h2 class="wp-block-heading toc">Netzteil</h2>



<p>Die stabile Stromversorgung übernimmt ein Prototyp von Seasonic – exklusiv für die Höllenmaschine 7 entwickelt. Das Unikat kombiniert die Leistungsfähigkeit des Seasonic Platinum 1200 mit den ergonomischen Eigenschaften der Snow-Silent-Serie. So verkörpert das Seasonic SS-1200XP3 Snow Silent Höllenmaschine 7 Edition das Beste beider Welten: kraftvoll, energieeffizient und leise.</p>



<p>Das 1200-Netzteil garantiert dank der “80 PLUS Platinum”-Zertifizierung einen Wirkungsgrad von über 92 Prozent bei halber und von über 89 Prozent bei voller Auslastung. Die semipassive Lüftersteuerung des Seasonic-Modells erlaubt, abhängig von der Netzteiltemperatur, drei Betriebsmodi: geräuschlos, leise und maximale Kühlleistung.</p>



<p>Dank hochwertiger Komponenten liefert das Seasonic-Netzteil auch bei höchster Auslastung sehr stabile Spannungen und ist damit besonders für stark übertaktete Systeme wie die Höllenmaschine 7 geeignet. Das Single-Rail-Modell stellt auf der 12-Volt-Schiene bis zu 100 Ampere bereit und federt damit auch locker die Lastspitzen unseres Grafikkarten-Gespanns ab.</p>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure data-wp-context='{"imageId":"6a7dd4ebef706"}' data-wp-interactive="core/image" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on-async--click="actions.showLightbox" data-wp-on-async--load="callbacks.setButtonStyles" data-wp-on-async-window--resize="callbacks.setButtonStyles" src="https://b2c-contenthub.com/wp-content/uploads/2026/08/Seasonic-SS-1200XP3-Snow-Silent-Hollenmaschine-7-Edition.jpg?quality=50&amp;strip=all" alt="Seasonic SS-1200XP3 Snow Silent Höllenmaschine 7 Edition" class="wp-image-3210553" width="840" height="473" loading="lazy"><button class="lightbox-trigger" type="button" aria-haspopup="dialog" aria-label="Enlarge" data-wp-init="callbacks.initTriggerButton" data-wp-on-async--click="actions.showLightbox" data-wp-style--right="state.imageButtonRight" data-wp-style--top="state.imageButtonTop">
				<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewbox="0 0 12 12">
					<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z"></path>
				</svg>
			</button></figure><p class="imageCredit">PC-WELT</p></div>



<p>Das vollmodulare Kabelmanagement bietet neben dem obligatorischen 24-Pin-Hauptanschluss eine 4- und zwei 8-Pin-Steckverbindungen für die CPU. Hinzu kommen jeweils zehn 6+2-polige PCI-Express-, 14 SATA-, fünf Molex- und sogar noch ein Floppy-Stecker. Seasonic gewährt 7 Jahre Herstellergarantie inklusive Austauschservice. Für die Verkabelung verwenden wir schwarz-rot gesleevte Kabel von CableMod.</p>



<h2 class="wp-block-heading toc">Boxen: Teufel Concept E 450 Digital</h2>



<p>Ein Lautsprecher-Set ist bei der Höllenmaschine 7 natürlich auch mit dabei. Das Teufel Concept E 450 Digital bietet 5.1-Raumklang mit einer Nennleistung von satten 500 Watt. Das Boxen-Set des deutschen Herstellers Teufel passt nicht nur vom Namen her perfekt zu unserem 36.000-Euro-Traumrechner, sondern ist auch technisch auf der Höhe der Zeit:</p>



<p>Dank seiner zahlreichen digitalen sowie analogen Schnittstellen können Sie das Concept E 450 Digital an der Spielekonsole, dem Home-Entertainment-System, Smartphone oder dem PC betreiben. An Bord des Multitalents ist zudem ein Bluetooth-Empfänger, der das kabellose Streaming von mobilen Geräten ermöglicht.</p>



<p>Bei den Lautsprechern handelt es sich um 2-Wege-Satelliten, jeweils ausgestattet mit einem 80-Millimeter-Mitteltöner sowie einem 19-Millimeter-Hochtöner. Doch richtig dick kommt es beim Subwoofer: Mit einer Leistung von 200 Watt, einem Gewicht von über 27 Kilogramm und einem 300 Millimeter großen Tieftöner donnern Explosionen wundervoll realistisch durch den Raum.</p>



<p>Clever ist auch die drahtlose Fernbedienung Puck-Control, die im Lieferumfang der Teufel Concept E 450 Digital enthalten ist. Durch die Drehung des Pucks regulieren Sie die Lautstärke. Drücken Sie den Puck nach unten, schalten Sie das Lautsprecher-Set ein und aus. Und über eine seitliche Taste am Puck wählen Sie die Quelle für die Sound-Ausgabe aus.</p>



<h2 class="wp-block-heading toc">Gaming-Peripherie von Roccat</h2>



<p>Die Gaming-Maus der Höllenmaschine 7 lässt sich flexibel an die eigenen Bedürfnisse anpassen: Die Roccat Nyth ist eine von wenigen Mäusen auf dem Markt, die eine modulare Tastenbestückung sowie den Wechsel des Seitenteils erlaubt. Dabei überzeugen Verarbeitung und Qualität der Komponenten.</p>



<p>Der Laser-Sensor bietet eine extrem hohe Auflösung von bis zu 12 000 DPI und damit auch eine extrem präzise Steuerung. Dank 1000 Hertz Polling-Rate setzt die Maus auch blitzschnell Bewegungen um. Das Logo auf der Oberseite sowie die linke Unterseite erstrahlen je nach Wunsch in der kompletten RGB-Farbpalette – inklusive Effekten wie Atmen oder Herzschlag.</p>



<p>Über den Swarm-Treiber ist ein hochgradiges Feintuning der Roccat-Maus möglich. Dabei lassen sich nicht nur optische Eigenschaften wie die Beleuchtung, sondern auch technische Funktionen wie die Polling-Rate und die Auflösung minutiös einstellen. Für mehr Informationen lesen Sie bitte den ausführlichen Praxis-Test zur Roccat Nyth.</p>



<p>Die Gaming-Maus der Höllenmaschine 7 begleitet das Mauspad Roccat Taito Control. Die Nager-Auflage ist lediglich 3 Millimeter dünn. Zudem ist das Mauspad groß genug für ausholende Mausbewegungen: Das Roccat Taito Control ist 400 Millimeter lang sowie 320 Millimeter breit.</p>



<p>Doch damit nicht genug. Neben Maus und Mauspad spendiert Roccat auch noch eine pfiffige Maushalterung: Die blau beleuchtete Roccat Apuri bringt einen aktiven 4-Port-USB-Hub mit. Die Maushalterung lässt sich aber auch abnehmen, sodass Sie den USB-Hub auch ohne Aufsatz nutzen können.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>Eine robuste und präzise arbeitende Gaming-Tastatur darf bei der Höllenmaschine 7 natürlich nicht fehlen. Die Roccat Ryos MK FX ist mit mechanischen Cherry-MX-Schaltern in der RGB-Brown-Variante ausgestattet, ein Garant für lange Lebensdauer und Zuverlässigkeit – inklusive individuell konfigurierbarer Tastenbeleuchtung mit über 16,8 Millionen Farben.</p>



<p>Dank integriertem Anti-Ghosting und N-Key-Rollover verschluckt das Mechanik-Flaggschiff auch keine parallel ausgeführten Tastenanschläge. Für selbst programmierte Makros gibt es 8 zusätzliche frei belegbare Tasten. Zur weiteren Ausstattung zählen zwei USB-2.0- sowie zwei Audio-Buchsen.</p>



<p>Das Peripherie-Paket von Roccat beinhaltet dieses Jahr auch eine Transporttasche, damit der Gewinner oder die Gewinnerin der Höllenmaschine 7 die Eingabegeräte auch bequem und sicher auf die LAN-Party mitnehmen kann. Die Roccat Into besteht aus besonders strapazierfähigem Nylon.<br>Das mobile Headset der Höllenmaschine 7</p>



<p>Und damit auf dem Weg zur LAN-Party keine Langeweile aufkommt, rundet das In-Ear-Headset Roccat Aluma das Peripherie-Paket erst so richtig ab. Das Kabelmikrofon des Roccat-Headsets verfügt über eine Mute-Taste. Mit im Lieferumfang des Aluma sind sechs Earplugs in drei Größen sowie ein integrierter Y-Splitter.</p>



<h2 class="wp-block-heading toc">Headset: MMX 300 Manufaktur</h2>



<p>Robuste Bauweise, präziser Klang und edle Materialien: Das MMX 300 gilt fast als das Nonplusultra in Hinblick auf Gaming-Headsets und passt damit ausgezeichnet zur Höllenmaschine 7. Das Besondere an der Manufaktur-Variante ist die Möglichkeit, eine eigene Wahl bei Farbe, Materialien und Technik zu treffen: So lassen sich unter anderem die Farbe, das Material der Ohrmuscheln, die Aufhängung, das Ohrpolster und das Kopfband über vordefinierte Auswahlmöglichkeiten individuell an den persönlichen Geschmack anpassen. Sogar eine Lasergravur ist möglich.</p>



<p>Die Impedanz der Kopfhörer liegt wahlweise bei 32 oder 600 Ohm. Das Kabel ist mit einer Länge von 2,5 Metern großzügig bemessen. Die 3,5-Klinkenstecker sind vergoldet, dazu gibt’s 1x USB und einen 3,5-auf-6.5-mm-Adapter. Das Headset wiegt 380 Gramm und bietet einen ausgezeichneten Tragekomfort, die Geräuschisolierung funktioniert ebenfalls hervorragend.</p>



<p>In unserem Test überzeugt der Beyerdynamic MMX 300 mit professionell abgestimmten, hochpräzisen Tonbereichen. Die Dynamik sucht ihresgleichen und die Wiedergabe von Explosionen, feinen Orchesterstücken und Filmen ist überaus detailgetreu. Auch der Raumklang beeindruckt: So lassen sich etwa Gegner tatsächlich anhand ihrer Schritte orten. Das Mikrofon überträgt Stimmen qualitativ optimal.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>Für professionelle Audioaufnahmen im Innen- und Außenbereich ist das MCE 85 BA gedacht. Das 110 Gramm leichte Beyerdynamic-Modell ist gleichermaßen als flexibles Handmikrofon sowie als Aufsatz für Film- und DSLR-Kameras geeignet. Das Richtrohr-Kondensatormikrofon deckt einen Frequenzbereich von 34 Hz bis 19 kHz ab. Die Nennimpedanz liegt bei 20 Ohm, der Rauschabstand bei 74 dB (SNR).</p>



<p>Das Mikrofon mit Keule-Superniere-Richtcharakteristik bietet neben der Phantomspeisung auch Batteriebetrieb mit handelsüblichen AA-Zellen an. Ein DC/DC- Wandler sorgt auch bei abfallender Batteriespannung für ein konstantes Mikrofon-Ausgangssignal und garantiert so eine gleichbleibend hohe Aufnahmequalität.</p>



<p>Die Batterielaufzeit erreicht bis zu 160 Stunden. Neben dem Mikrofon enthält das Kit auch viel Zubehör, darunter einen Windschutz und -jammer, einen Photoschuh sowie diverse Halterungen, Adapter und Kabel.</p>



<h2 class="wp-block-heading toc">Wasserkühlung</h2>



<p>Wasserkühlungs-Spezialist Aquatuning lässt sich auch dieses Jahr nicht lumpen und stellt ein Komplettpaket mit Profi-Komponenten von A wie Ausgleichsbehälter bis Ü wie Überwachungs-Sensorik zusammen. Zu den zentralen Komponenten der 2500-Euro-Kühllösung gehören zwei 560er- und ein 360er-Radiator, die sich – mit tatkräftiger Unterstützung von zwei Dutzend flüsterleisen Noiseblocker-Lüftern – um die Abwärme von CPU, RAM und dem 3-Way-SLI-Verbund kümmern.</p>



<p>Am Aquacomputer aquaero 6 XT sind Durchfluss-, Druck- und Temperatursensoren aus dem Hause Alphacool angeschlossen. Aber auch alle Lüfter melden dem Steuerungsgerät via Pulsweitenmodulation (PWM) ihre Rotationsgeschwindigkeit. Da der aquaero allerdings nur über vier PWM-Eingänge verfügt, sind in der Höllenmaschine Lüftergruppen über PWM-Splitter zu einzelnen Kanälen zusammengeführt. So hängen beispielsweise die acht Lüfter der unteren Radiatoren an einem einzigen Kanal.</p>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure data-wp-context='{"imageId":"6a7dd4ebf02f3"}' data-wp-interactive="core/image" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on-async--click="actions.showLightbox" data-wp-on-async--load="callbacks.setButtonStyles" data-wp-on-async-window--resize="callbacks.setButtonStyles" src="https://b2c-contenthub.com/wp-content/uploads/2026/08/von-Aquatuning-Die-Wasserkuhlung-der-Hollenmaschine-7.jpg?quality=50&amp;strip=all" alt="Die Wasserkühlung der Höllenmaschine 7 " class="wp-image-3210557" width="840" height="473" loading="lazy"><button class="lightbox-trigger" type="button" aria-haspopup="dialog" aria-label="Enlarge" data-wp-init="callbacks.initTriggerButton" data-wp-on-async--click="actions.showLightbox" data-wp-style--right="state.imageButtonRight" data-wp-style--top="state.imageButtonTop">
				<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewbox="0 0 12 12">
					<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z"></path>
				</svg>
			</button></figure><p class="imageCredit">PC-WELT</p></div>



<p>Von Alphacool stammen auch die Kühlkörper für CPU, RAM und die drei Grafikkarten sowie die AGB-Pumpen-Kombi und die transparenten Schläuche, die rot gefärbte Kühlflüssigkeit führen. Ein Hingucker ist der Ausgleichsbehälter ” Eisbecher”, der die Kühlflüssigkeit im oberen Bereich in eine mehrstrahlige Fontäne verwandelt. Und falls man einmal etwas an der Höllenmaschine 7 verändern will, ist die antistatische Arbeits- und Montagematte Alphacool Eisplateau auch noch im Paket enthalten.<br>ECO-System: Zotac Zbox SN970 NEN Steam Machine</p>



<h2 class="wp-block-heading toc">ECO-System von Zotac </h2>



<p>Die 7. Generation der Höllenmaschine ist konzipiert für maximale Rechenleistung durch optimale Kühlung. Deshalb gibt es dieses Jahr auch nur ein einziges Hauptsystem, dem sich das Rechner-Design unterordnen muss. Auf das beliebte Eco-System wollen wir natürlich nicht verzichten, das haben wir in den Mini-PC <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">Zotac Zbox SN970 NEN Steam Machine</a> outgesourct.</p>



<p>Die zentrale CPU-GPU-Kombi der Zbox setzt sich aus einem Vierkerner Core i5-6400T &amp; Geforce GTX 960 zusammen. Der Nvidia-Grafikchip verfügt über 1280 Shader-Einheiten, der GPU-Takt liegt bei maximal 924 MHz. Der Grafikprozessor darf auf 3 GB GDDR5-SDRAM zurückgreifen, das mit einer Frequenz von 1253 MHz läuft – effektiv also mit rund 5 GHz. Über einen UHD-Fernseher lassen sich problemlos 4K-Inhalte mit 60 Hertz wiedergeben, da die Geforce GTX 960 gleich viermal HDMI 2.0 ausführt.</p>



<p>Die Zotac Zbox SN970 NEN Steam Machine hält für Daten eine 1-TB-Festplatte bereit. Für das ECO-System der Höllenmaschine 7 ist das natürlich keine adäquate Lösung. Deswegen haben wir von Zotac eine zusätzliche SSD fürs Betriebssystem verlangt. Den Job übernimmt die M.2-SSD Kingston SM2280S3G2 mit 240 GB Kapazität.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>Dem 2,2-GHz-Quad-Core sind in der Basiskonfiguration 8 GB DDR3L-Speicher zur Seite gestellt – wir haben den Arbeitsspeicher in der Zbox selbstredend gleich auf 16 GB aufgerüstet. Mit an Bord der Zbox sind auch WLAN 802.11a/b/g/n/ac, Bluetooth 4.0 sowie ein Kartenleser. An Anschlüssen hält die Zbox SN970 NEN 2x USB 3.0, 2x USB 2.0, 2x Gigabit-Ethernet und 2x Klinke bereit.</p>



<p>Wie es sich für eine Steam Machine gehört, ist bereits das Steam-Betriebssystem auf der Zbox installiert und im Lieferumfang ist der Steam-Controller enthalten. Betriebssystem und Controller erlauben den Zugriff auf zahlreiche Titel aus dem Angebot der gleichnamigen Spiele-Vertriebsplattform. Im folgenden Video stellen wir Ihnen das Zusammenspiel aus Zbox, Steam Machine und Controller ausführlich vor:</p>



<p>Selbstverständlich lässt sich auf der Zbox auch eine andere Linux-Distribution oder Windows installieren. Wir haben auf unserem ECO-System neben Steam OS auch noch Windows 10 aufgespielt. Mithilfe eines Bootloaders können Sie die Zbox also je nach Gusto als Steam Machine oder als Windows-10-HTPC nutzen.</p>



<h2 class="wp-block-heading toc">Gaming Chair</h2>



<p>Die Fans der Höllenmaschine haben es lauthals gefordert – und Sie wissen ja: Wir hören auf unsere Leser und Zuschauer. Deswegen haben wir uns von Caseking einen bequemen 360-Grad-Drehstuhl mit Gasdruckfeder im schwarz-roten Racing-Design für die Höllenmaschine 7 spendieren lassen. Die S-Klasse unter den Spiele-Stühlen setzt auf Kaltschaum-Polsterung und PVC-Lederbezug.</p>



<p>Der 300-Euro-Stuhl verfügt über Komfortfunktionen wie in 8 Richtungen verstellbare Armlehnen, eine integrierte Wippfunktion samt Feststellmechanismus sowie zusätzliche Stützkissen im Nacken- und Steißbereich. Die Rückenlehne ist um bis zu 170 Grad variabel verstellbar – so lässt sich auf der LAN-Party auch mal ein Nickerchen machen.</p>



<p>Die stabile Stahl-Basis thront auf einem Aluminium-Fußkreuz mit fünf beständigen Rollen. Das Vertagear-Modell ist für ein Körpergewicht von bis zu 150 Kilogramm ausgelegt. Und Ihre Körpergröße sollte für optimalen Sitzkomfort auf dem Vertagear Racing VG-SL4000 idealerweise zwischen 173 und 190 Zentimeter betragen.</p>



<h2 class="wp-block-heading toc">Software</h2>



<p>Das Betriebssystem der Wahl für die Höllenmaschine 7 ist das moderne Windows 10. Allein schon wegen der fortschrittlichen Grafik- und Programmierbibliothek DirectX 12 kommen wir an dem aktuellen Microsoft-Betriebssystem nicht vorbei. Selbstredend haben wir uns für die Pro-Version entschieden, die gegenüber der „normalen“ Windows-10-Version einige Vorteile besitzt. Darunter sind beispielsweise Funktionen wie Assigned Access, Bitlocker, Business Store, Domain Join, Enterprise Data Protection, Group Policy Management und Remote Desktop.</p>



<p>Und mit unseren 128 GB Speicher muss es natürlich die 64-Bit-Variante von Windows 10 sein. Zusätzlich packen wir eine weitere Lizenz von Windows10 Pro 64 Bit ins Gesamtpaket, damit Sie auf Wunsch auch auf dem ECO-System der Höllenmaschine 7 das Microsoft-Betriebssystem installieren können.</p>



<p>Ein Office-Paket ist ebenfalls im Lieferumfang der Höllenmaschine 7 enthalten. Mit der Lizenz für Microsoft Office 365 Home nutzen Sie ein Jahr lang gängige Büroprogramme wie Excel, Powerpoint und Word. Die Lizenz gilt für bis zu fünf PCs respektive Apple Macs gleichzeitig.</p>



<p><strong>Developer-Software: Microsoft Visual Studio Pro 2015 + MSDN</strong></p>



<p>Die Höllenmaschine 7 richtet sich dieses Jahr nicht nur an Gamer, sondern will auch Profi-Kreative mit Software-Futter versorgen. Deswegen haben wir drei fette Programm-Pakete geschnürt. Für Entwickler von Apps, Internetseiten, Web-Services und Windows-Programmen ist die Developer-Software Microsoft Visual Studio Pro 2015 gedacht. Die Entwicklungsumgebung unterstützt Hochsprachen wie C, C++, C++/CLI, C++/CX, C#, F#, HTML, Javascript und Visual Basic.NET.</p>



<p>Doch damit nicht genug. Die 12-monatige Lizenz für Microsoft Visual Studio Pro 2015 bekommen Sie bei der Höllenmaschine 7 inklusive Zugang zum Microsoft Developer Network (MSDN). Damit haben Sie einen Test-Zugriff auf alle Microsoft-Programme und Software-Suiten. Der Gesamtwert des Entwickler-Pakets inklusive MSDN-Zugang liegt bei 1500 Euro.</p>



<p><strong>3D-Grafik-Software: Maxon Cinema 4D R17.0 Studio</strong></p>



<p>Im ersten Kreativ-Paket der Höllenmaschine 7 ist die 3D-Grafik-Software Maxon Cinema 4D R17.0 Studio enthalten. Mit Cinema 4D lassen sich 3D-Modelle, Animationen, Computergrafiken und Texturen erstellen. Die Software kommt im professionellen Bereich etwa beim Postprocessing von Kinofilmen zum Einsatz.</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">

</div></figure>



<p>Die Studio-Version enthält Module für Spezialaufgaben wie Charakter-Animation und Netzwerk-Rendering. Aber auch die Anbindung an andere 3D-Anwendungen und Editing-Programme ist bei Cinema 4D über eine Vielzahl von Plug-ins möglich. Trotz der Komplexität erfordert Maxons Cinema 4D nur eine relativ kurze Einlernphase, sodass auch Einsteiger schnell zu ansehnlichen Ergebnissen gelangen. Der Wert der Studio-Lizenz beläuft sich auf satte 3000 Euro!</p>



<p><strong>Creative-Software-Paket: Adobe Creative Cloud</strong></p>



<p>Das Creative-Software-Paket der Höllenmaschine 7 liefert Ihnen die beliebtesten Programme aus den Bereichen Bildbearbeitung, Desktop Publishing, Post Processing, Videoschnitt und vielem mehr frei Haus: Mit der Adobe Creative Cloud können Sie ein Jahr lang die gesamte Kollektion von über 20 „Creative Cloud“-Apps und Programmen von Adobe nutzen. Darunter befinden sich Hochkaräter wie After Effects, Indesign, Photoshop und Premiere Pro.</p>



<p>Doch damit nicht genug. Für die Höllenmaschine 7 kommt natürlich nur das Premium-Abo inklusive Adobe Stock infrage. Mit dieser Abo-Option gewährt Ihnen Adobe Zugriff auf 40 Millionen lizenzfreie, hochwertige Stock-Fotos. Der Gesamtwert dieser Adobe-Lizenz liegt bei rund 1150 Euro.</p>



<h2 class="wp-block-heading toc">So gewinnen Sie die HMX 6</h2>



<p>Auch dieses Jahr verlosen wir die Höllenmaschine unter allen Teilnehmern:</p>


<span class="cta_btn_heading cta_btn_heading_"></span><div class="cta wp-block wp-block-button cta__btn_"><a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">Gewinnen Sie hier die HMX 6</a></div>


<h2 class="wp-block-heading toc">Wie Sie die HMX 6 verfolgen können</h2>



<p>In den kommenden Wochen folgen weitere Inhalte rund um die Höllenmaschine 6 auf <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">YouTube</a>, <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">Instagram</a>, <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">TikTok</a>, <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">Facebook </a>und natürlich auf <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">pcwelt.de</a>. Wenn Sie nichts verpassen wollen, sollten Sie den kostenlosen <a href="https://tsecurity.de/weiterlesen/3686964/3715111/36000-euro-fuer-einen-pc-was-die-hoellenmaschine-7-so-besonders-machte/" target="_blank" rel="noopener noreferrer">HMX-6-Newsletter abonnieren</a> – aber vergessen Sie nicht, die Anmeldung via E-Mail zu bestätigen.</p>

</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Apple Pay & Apple Card VP Jennifer Bailey is retiring]]></title>
<description><![CDATA[The executive who spearheaded Apple Pay, Jennifer Bailey, is retiring after 12 years as Vice President of Internet Services and Apple Pay.Jennifer Bailey is retiring after 23 years in Apple's employUnder Bailey's leadership, Apple launched Apple Wallet, Apple Pay, and Apple Card. She also supervi...]]></description>
<link>https://tsecurity.de/de/3714418/apple-ios-macos/apple-pay-apple-card-vp-jennifer-bailey-is-retiring/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3714418/apple-ios-macos/apple-pay-apple-card-vp-jennifer-bailey-is-retiring/</guid>
<pubDate>Thu, 13 Aug 2026 16:25:09 +0200</pubDate>
<content:encoded><![CDATA[The executive who spearheaded <a href="https://tsecurity.de/weiterlesen/3686271/3714418/apple-pay-apple-card-vp-jennifer-bailey-is-retiring/" target="_blank" rel="noopener noreferrer">Apple Pay</a>, Jennifer Bailey, is retiring after 12 years as Vice President of Internet Services and Apple Pay.<br><br><div><img src="https://media.appleinsider.com/gallery/68544-144432-jenniferbailey-xl.jpg" alt="Smiling woman with short blond hair sits in a red chair on a stage, wearing a brown jacket, with a microphone in front and a conference backdrop behind her"><br><span>Jennifer Bailey is retiring after 23 years in Apple's employ</span></div><br>Under Bailey's leadership, Apple launched <a href="https://tsecurity.de/weiterlesen/3686271/3714418/apple-pay-apple-card-vp-jennifer-bailey-is-retiring/" target="_blank" rel="noopener noreferrer">Apple Wallet</a>, Apple Pay, and Apple Card. She also supervises Tap to Pay on <a href="https://tsecurity.de/weiterlesen/3686271/3714418/apple-pay-apple-card-vp-jennifer-bailey-is-retiring/" target="_blank" rel="noopener noreferrer">iPhone</a>, Apple Gift Cards, and Apple Cash internationally.<br><br>She joined the company in 2003 as Vice President of Worldwide Online Stores in 2003, and was promoted in 2014.<br><br><br> <a href="https://tsecurity.de/weiterlesen/3686271/3714418/apple-pay-apple-card-vp-jennifer-bailey-is-retiring/" target="_blank" rel="noopener noreferrer">Continue Reading on AppleInsider</a> | <a href="https://tsecurity.de/weiterlesen/3686271/3714418/apple-pay-apple-card-vp-jennifer-bailey-is-retiring/" target="_blank" rel="noopener noreferrer">Discuss on our Forums</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[CIO 100 Award winners spotlight IT’s power to transform]]></title>
<description><![CDATA[Each year the CIO 100 Awards showcase outstanding IT initiatives, and every year they illustrate the power and potential of technology to transform how people work, how organizations perform, and the value they offer to customers.



The 2026 cohort of winners is no different. Each one demonstrat...]]></description>
<link>https://tsecurity.de/de/3713501/it-security-nachrichten/cio-100-award-winners-spotlight-its-power-to-transform/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3713501/it-security-nachrichten/cio-100-award-winners-spotlight-its-power-to-transform/</guid>
<pubDate>Tue, 11 Aug 2026 00:53:31 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>



<p class="wp-block-paragraph">Each year the <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">CIO 100 Awards</a> showcase outstanding IT initiatives, and every year they illustrate the power and potential of technology to transform how people work, how organizations perform, and the value they offer to customers.</p>



<p class="wp-block-paragraph">The <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">2026 cohort of winners</a> is no different. Each one demonstrates how IT executives and their teams successfully move from ideation to deployment to scaling a solution for the future, overcoming challenges and driving adoption along the way to ensure their organization gets a return on its investment.</p>



<p class="wp-block-paragraph"><strong>[ Interested in meeting and learning from all CIO 100 winners? Join us next week at CIO 100 Awards &amp; Conference in Frisco, TX. Limited seats remain! </strong><a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer"><strong>Register here</strong></a><strong> ]</strong></p>



<p class="wp-block-paragraph">The winning initiatives come from a range of industries and utilize a host of technologies to achieve their goals, as is the case annually. A growing proportion of these stand-out projects leverage artificial intelligence, raising the bar on the art of the possible for all IT departments.</p>



<p class="wp-block-paragraph">The following 10 award-winning projects serve as representatives for the outstanding work done by all the 2026 honorees.</p>



<h2 class="wp-block-heading">ABB democratizes AI agent creation and deployment</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> ABB</p>



<p class="wp-block-paragraph"><strong>Project:</strong> ABBY — AI Agentic Platform for Workforce Transformation</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Vikke Kandell</a>, CIO</p>



<p class="wp-block-paragraph">IT leaders at ABB, a manufacturer, had some big hurdles to clear when it came to building an AI strategy.</p>



<p class="wp-block-paragraph">They had to overcome employee fears that AI would take away jobs, the potentially high cost of AI vendor licenses, and pressure from investors, customers, and executives to advance the use of AI in the enterprise.</p>



<p class="wp-block-paragraph">“We looked at this and asked, ‘How do we address all this?’ and build something that the company is proud of,” says Babu Kuttala, vice president of data analytics and AI.</p>



<p class="wp-block-paragraph">The answer is ABBY, an AI agentic platform that enables employees to create and deploy specialized AI agents for specific business tasks.</p>



<p class="wp-block-paragraph">To build ABBY, Kuttala and his team used best-of-breed LLMs (about 25 in total). They built a centralized orchestration layer using generative AI that integrates internal knowledge bases with external ecosystems, creating a unified platform where agents can access enterprise data, understand required actions, and execute tasks across multiple systems. And they created preconfigured skills so that employees could build agents tailored to their workflows without having to code.</p>



<p class="wp-block-paragraph">ABBY was rolled out in 2025 to 100 users but is now used by 63,000 (more than 75% of the company’s workforce, Kuttala notes) with an average of 10,000-plus workers using it daily. IT continues to add LLMs and capabilities to expand use of ABBY even further, Kuttala says.</p>



<h2 class="wp-block-heading">Belcorp modernizes manufacturing with Smart Factory</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Belcorp</p>



<p class="wp-block-paragraph"><strong>Project:</strong> QPlant — Smart Factory</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Venkat Gopalan</a>, Chief Digital, Data, and Technology Officer</p>



<p class="wp-block-paragraph">Legacy processes were limiting Belcorp’s ability to scale and compete. Its manufacturing relied on ERP-driven processes with limited shop-floor automation and weak connectivity across production, packaging, quality, and maintenance. The company depended heavily on manual records and post-process reconciliation, resulting in fragmented data, limited real-time insight, inefficiencies, and higher risks for errors.</p>



<p class="wp-block-paragraph">Smart Factory changed all that. The IT initiative reimagined how manufacturing teams work “by creating a connected, data-driven environment where production, quality, maintenance, and operations are aligned around real-time information and standardized execution,” says Venkat Gopalan, chief digital, data, and technology officer.</p>



<p class="wp-block-paragraph">At Smart Factory’s core is a manufacturing execution system that orchestrates production workflows, quality processes, and operational execution, he explains. IoT-enabled equipment integration and a centralized SCADA platform provide real-time visibility into shop-floor operations, while electronic batch records digitize production execution, strengthen traceability, and reinforce compliance by design.</p>



<p class="wp-block-paragraph">Integrating those operational technologies with the company’s enterprise platforms was another critical component of success, Gopalan says, creating a trusted flow of real-time data across manufacturing, quality, maintenance, and business systems. “This connected architecture transformed isolated data into actionable insights, enabling faster decision-making, greater operational visibility, and continuous improvement across the manufacturing lifecycle,” he adds.</p>



<p class="wp-block-paragraph">The initiative generated more than $1 million in financial benefits in its first year alone.</p>



<p class="wp-block-paragraph">“Most importantly, Smart Factory established the digital foundation for the future of manufacturing at Belcorp,” Gopalan says. “With real-time operational data and connected systems now in place, we’re well positioned to accelerate advanced analytics, AI-driven optimization, predictive maintenance, and other Industry 4.0 capabilities that will continue delivering value for years to come.”</p>



<h2 class="wp-block-heading">Cohesity replatforms post-acquisition for commercial growth</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Cohesity</p>



<p class="wp-block-paragraph"><strong>Project:</strong> Lead to Cash Replatforming Program (Veritas Integration)</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Brian Spanswick</a>, CIO</p>



<p class="wp-block-paragraph">Cohesity set an ambitious objective: Complete an enterprise-scale lead-to-cash replatform in under six months.</p>



<p class="wp-block-paragraph">That’s a tight timeline for any replatforming initiative, but Cohesity’s project had another layer of complexity. It followed Cohesity’s December 2024 acquisition of Veritas, a company twice its size in revenue, leaving Cohesity to integrate the majority of a global enterprise revenue engine into its own operating model without disrupting customers, partners, or sellers.</p>



<p class="wp-block-paragraph">“We had to bring the two companies together, merge the workforces together, and create an overall harmonized organization and operating infrastructure platform,” says Eric Brown, who as CFO and COO led the project.</p>



<p class="wp-block-paragraph">The program migrated heavily customized CRM, CPQ, PRM, ERP, and subscription platforms (some of which were “very brittle, very bespoke,” Brown says) to a unified SaaS CRM, CPQ, and ERP environment with uninterrupted selling, billing, and partner operations.</p>



<p class="wp-block-paragraph">This was no lift-and shift, Brown stresses. “It was a business process optimization project as well. We want to run very efficiently, so we questioned everything and used the migration process to simplify and streamline the business in every possible respect.”</p>



<p class="wp-block-paragraph">The initiative enabled continuity for 13,000-plus customers, protected revenue during integration, and established a scalable commercial foundation for future growth.</p>



<p class="wp-block-paragraph">Brown cites several factors that contributed to success. First, leadership was upfront about what it would take to meet the deadline, a process that involved carefully prioritizing the capabilities that would appear in the first iteration. Leadership also streamlined decision-making, establishing office hours that “ran with military precision” to handle issues. And the company selected a specialized partner, requiring its top talent be assigned to Cohesity.</p>



<h2 class="wp-block-heading">Dairyland Power goes agentic to protect field crews</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Dairyland Power Cooperative</p>



<p class="wp-block-paragraph"><strong>Project:</strong> ODIN — Organizational Effectiveness Agentic AI</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Nate Melby</a>, VP and CIO</p>



<p class="wp-block-paragraph">Dairyland Power Cooperative had amassed a large collection of field observations, incident reports, near-misses, safety rules, and work methods that could yield insights into processes and practices that could help protect its workers.</p>



<p class="wp-block-paragraph">But the insights were essentially out of reach, trapped in siloes.</p>



<p class="wp-block-paragraph">Dairyland’s organizational effectiveness team turned to CIO Nate Melby for help unlocking those insights. Melby then turned to agentic AI, recognizing that the technology could address the team’s need to make better use of its data.</p>



<p class="wp-block-paragraph">“This was about finding insights on how to work more safely,” Melby says. “It’s about preventing incidents.”</p>



<p class="wp-block-paragraph">The collaboration between the two teams created ODIN, the first agentic AI implementation of its kind in the electric utility industry.</p>



<p class="wp-block-paragraph">Focused on worker safety, ODIN autonomously connects the collective safety knowledge of the organization and delivers actionable insights directly to field crews at the moment work is planned.</p>



<p class="wp-block-paragraph">ODIN was developed through a hybrid approach that combined an agentic AI platform and Dairyland’s internal private generative AI platform called VoltWrite. ODIN leverages LLMs, retrieval-augmented generation, and a coordinated swarm of autonomous agents.</p>



<p class="wp-block-paragraph">Agents work together to analyze internal safety data, performance history, work practices, and safety rules and then synthesize the information into clear guidance on the safest way to perform specific tasks.</p>



<p class="wp-block-paragraph">ODIN has produced results, including a reduction in OSHA recordable injuries and improvements in the quality and consistency of pre-job safety briefings.</p>



<p class="wp-block-paragraph">ODIN was deployed in early 2025 for use by Dairyland’s workers in transmission construction and electrical maintenance, which are the highest-risk work areas. Dairyland is looking to expand ODIN’s use to other teams.</p>



<h2 class="wp-block-heading">Dow’s digital sustainability ledger drives low-carbon sales</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Dow</p>



<p class="wp-block-paragraph"><strong>Project:</strong> Carbon Footprint Ledger</p>



<p class="wp-block-paragraph"><strong>IT leader: </strong><a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Deb Bauler</a>, Chief Information and Digital Officer</p>



<p class="wp-block-paragraph">Executives at Dow consider the Carbon Footprint Ledger (CFL) as more than a technology or innovative carbon accounting methodology. According to Senior Global IT Director <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Jeremy Preston</a>, CFL is “a digital business capability that enables Dow to translate sustainability investments into customer value.”</p>



<p class="wp-block-paragraph">CFL transformed how Dow uses greenhouse gas emissions data. It combines a methodology aligned to international standards with an enterprise-scale digital platform. It also integrates manufacturing, supply chain, commercial, and sustainability data to generate product carbon footprints under enterprise-level governance and management at scale.</p>



<p class="wp-block-paragraph">In doing so, Preston says it creates “a trusted, traceable link between low-carbon processes and raw materials implemented across its manufacturing network and the lower-carbon products customers seek.”</p>



<p class="wp-block-paragraph">The technology team worked closely with sustainability and business teams, collaboratively developing the capabilities needed to reconstruct product genealogy, maintain end-to-end data lineage, track low-carbon attributes across interconnected manufacturing processes, and generate product carbon footprints that can support customer offerings and commercial transactions.</p>



<p class="wp-block-paragraph">CFL was built on Dow’s Integrated Data Hub and in partnership with Boston Consulting Group and Databricks.</p>



<p class="wp-block-paragraph">The core CFL platform is fully deployed and supports commercial transactions today.</p>



<p class="wp-block-paragraph">Preston says CFL “enables Dow to turn sustainability investments into customer value, commercial differentiation, and new growth opportunities.” Dow reports that it has driven hundreds of millions of dollars in low-carbon product sales in 2025 and 2026.</p>



<p class="wp-block-paragraph">The company is now expanding its use. “We are extending adoption across additional products, manufacturing networks, business segments, and customer use cases while continuing to enhance automation, analytics, and integration with commercial processes,” Preston says.</p>



<h2 class="wp-block-heading">J&amp;J transforms quality management with AI</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Johnson &amp; Johnson</p>



<p class="wp-block-paragraph"><strong>Project:</strong> Q&amp;C Strategy</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Michael Comprelli</a>, Vice President, Head of Technology, Technical Operations, and Risk; <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Joel O’Connor</a>, Head of Technology, Medtech Quality, and Compliance</p>



<p class="wp-block-paragraph">Johnson &amp; Johnson is using AI to transform quality management through its Q&amp;C Strategy.</p>



<p class="wp-block-paragraph">QuIn is an AI-powered digital assistant that fuses human expertise with machine learning, automation, and data-driven insights to boost efficiency, reliability, and worker impact. By embedding gen AI into core quality management systems processes, QuIn proactively gathers actionable insights, increases operational efficiency, and allows teams to focus on high-value, patient-centric work.</p>



<p class="wp-block-paragraph">Cora is an innovative generative AI platform that provides regulatory intelligence monitoring, impact analysis, and augmented content revision. Cora assists with document analysis, compliance comparison, stakeholder analysis, policy/standard creation, procedural/document updates, and document comparison. Cora is purpose-built for regulated environments, validating outputs against source material and offering a user experience that instills trust in the outcome.</p>



<p class="wp-block-paragraph">QuIn and Cora, which automate time-intensive tasks and democratize information access, are on track to deliver significant value, with J&amp;J reporting more than $62 million in documented true cost savings by 2028 from QuIn alone. Cora delivered $2 million in cost efficiency in 2025 and will deliver a documented cost savings of $25 million by 2028.</p>



<p class="wp-block-paragraph">“Our teams proved responsible AI can be applied meaningfully in a highly regulated environment without compromising the rigor, accountability, or human judgment that quality requires,” says Michael Comprelli, vice president, head of technology, technical operations, and risk.</p>



<p class="wp-block-paragraph">He continues, saying that J&amp;J “moved these ideas beyond experimentation and into products that employees use in their daily work. We did that by bringing together Quality expertise, product management, data engineering, architecture, cybersecurity, user-experience design and AI engineering around a common purpose.”</p>



<h2 class="wp-block-heading">JLL brings intelligent automation to business services</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> JLL</p>



<p class="wp-block-paragraph"><strong>Project:</strong> Business Service Digitization</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Pinak Dash</a>, Global Head of JLL Business Services and Legal Technologies</p>



<p class="wp-block-paragraph">JLL launched its digitization initiative to drive process redesign as well as systematic AI and RPA deployment across JLL Business Services (JBS).</p>



<p class="wp-block-paragraph">The initiative was designed to address inefficiencies that hampered scalability and competitive positioning. It was also designed to eliminate manual processes that consumed thousands of hours across finance, HR, legal, procurement, marketing, research, IT, and lease administration.</p>



<p class="wp-block-paragraph">Pinak Dash, global head of JBS and legal technologies, says the digitization initiative had a dual-strategy combining traditional digitization with generative AI innovation to hundreds of processes.</p>



<p class="wp-block-paragraph">JLL lists three innovations critical to the program’s success.</p>



<p class="wp-block-paragraph">First is a hybrid platform that integrates RPA with JLL’s proprietary AI platform called Falcon, which created intelligent automation that adapts and learns. It enables real-time process automation, intelligent document processing with automated extraction/validation, and smart decision-making for continuously optimizing workflows.</p>



<p class="wp-block-paragraph">The second innovation is its use of ProHance for real-time process monitoring and enabling of data-driven optimization. Sensors capture granular productivity metrics, identify bottlenecks, and provide actionable insights for continuous improvement across automated and manual processes.</p>



<p class="wp-block-paragraph">Third is its custom AI assistants and transaction agents. Falcon-powered assistants provide intelligent knowledge search while specialized agents execute complex transactions across enterprise SaaS platforms. These handle multisystem workflows, reducing human touchpoints while maintaining accuracy and compliance.</p>



<p class="wp-block-paragraph">Dash says the initiative has delivered quantifiable benefits through improved efficiency, accuracy, and quality of services provided to clients.</p>



<p class="wp-block-paragraph">“The initiative delivers on our business goals, makes us more efficient, provides customers better service, and it opens up the capabilities and bandwidth of our people to do what they like to do and to find innovative ways to serve our business,” he adds.</p>



<h2 class="wp-block-heading">Nationwide partnership platform delivers efficiencies, business growth</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Nationwide</p>



<p class="wp-block-paragraph"><strong>Project:</strong> Enterprise Digital Platform (EDP)</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Michael Carrel</a>, EVP and CTO</p>



<p class="wp-block-paragraph">Nationwide’s new Enterprise Digital Platform (EDP) gives the company “a scalable way to connect with external partners quickly, securely, and consistently across all areas of our business,” says company EVP and CTO Michael Carrel.</p>



<p class="wp-block-paragraph">He explains that “instead of treating every integration as a custom effort, EDP creates a common front door for digital products, documentation, onboarding and governance.”</p>



<p class="wp-block-paragraph">That innovation has produced better experiences for the company’s partners. It saves time for Nationwide teams, partners, and customers. And it supports faster launch times for new products and enables growth across the business.</p>



<p class="wp-block-paragraph">“EDP changed the model from fragmented, point-to-point integrations into an enterprise platform built around reusable digital products. That shift lets us support a range of integration options in one governed environment, meet partners at different stages of technical maturity, and add new capabilities over time without redesigning every relationship from scratch,” Carrel explains.</p>



<p class="wp-block-paragraph">EDP uses cloud-native microservices, role-based access control, and advanced analytics. Nationwide IT created modular microservices to make EDP more scalable, resilient, and adaptable. And IT decoupled it from infrastructure-specific dependencies so that it would be a platform-agnostic developer portal. That, Carrel says, reduced operational constraints across environments.</p>



<p class="wp-block-paragraph">Additionally, IT shifted from a user-specific model to role-based access, which improved security, simplified administration, and better served the needs of different audiences.</p>



<p class="wp-block-paragraph">Meanwhile, robust analytics delivers visibility into platform usage and performance, which Carrel says helps ensure Nationwide continuously evolves the platform based on measurable outcomes.</p>



<p class="wp-block-paragraph">The core platform is fully deployed, with Nationwide planning to expand it.</p>



<p class="wp-block-paragraph">“Our Enterprise Digital Platform is more than a piece of technology,” Carrel notes, “it represents a strategic enabler to support growth objectives across Nationwide’s businesses.”</p>



<h2 class="wp-block-heading">PITT Ohio fast-tracks shipment requests with AI assist</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> PITT Ohio</p>



<p class="wp-block-paragraph"><strong>Project:</strong> No Touch Email (N@TE AI)</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Scott Sullivan</a>, President and CEO (formerly CIO)</p>



<p class="wp-block-paragraph">As PITT Ohio started its AI journey in 2024, the mandate was clear: Use the technology to solve “real problems,” says Ryan Carner, director of enterprise IT solutions.</p>



<p class="wp-block-paragraph">“We wanted to hit the ground running and find a problem that was solvable,” Carner says, noting that the company also wanted to use the experience to build in-house AI skills. “The idea was to find a business case for AI that would be our first but not the only one.”</p>



<p class="wp-block-paragraph">PITT Ohio leaders decided to tackle what Carner describes as a “mundane but very important task for how our business operates”: handling emails to the customer service team.</p>



<p class="wp-block-paragraph">The need was significant. Customer service representatives were manually processing hundreds of pickup request emails daily, each requiring five to 15 minutes to interpret and re-enter shipment details into the company’s transportation management system (TMS). The emails were complicated, containing a lot of information submitted in nonstandardized ways and varying formats. This repetitive task consumed valuable time, introduced errors, and delayed customer response.</p>



<p class="wp-block-paragraph">N@TE uses generative AI and natural language processing to transform unstructured email content into structured pickup orders automatically and in real-time. N@TE scans incoming emails, extracts key shipment data, and creates orders directly in the TMS via API integration. It operates seamlessly within existing workflows, requiring no change in customer behavior or retraining of staff.</p>



<p class="wp-block-paragraph">PITT Ohio deployed N@TE in 2025, and the company also secured a patent for the product that year. N@TE has produced a 30-60X increase in processing speed, 99% accuracy in extracting and populating order data, and a 70% reduction in handling costs per pickup order.</p>



<h2 class="wp-block-heading">SMU builds AI adoption through grassroots ambassador program</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Southern Methodist University</p>



<p class="wp-block-paragraph"><strong>Project:</strong> Scaling AI Without Scaling AI: Organizational AI Scaling Through Willingness</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Jason Warner</a>, Associate CIO</p>



<p class="wp-block-paragraph">Like executives in most organizations, leaders at Southern Methodist University encountered mixed attitudes about AI. Some workers had little interest in using the tech, others were afraid it would take jobs, still others were curious about what it could do.</p>



<p class="wp-block-paragraph">Associate CIO Jason Warner and other leaders decided to leverage that last group, believing the best way to get SMU faculty and staff to embrace AI was to use enthusiasts to help smooth the way.</p>



<p class="wp-block-paragraph">So, instead of treating AI as a conventional technology rollout, Warner and his colleagues built opt-in communities of practice known as the AI Coalition of the Willing and Operation Copilot.</p>



<p class="wp-block-paragraph">The goal, Warner says, was to build institutional capability, reduce risk, and generate momentum.</p>



<p class="wp-block-paragraph">“We knew the fastest way to scale AI was to scale the willingness of people to use the technology, and not talking to people about cost savings and the like,” Warner says, adding that willing users as great ambassadors and evangelists who showcase in formal and informal ways the technology’s potential for hesitant or skeptical colleagues.</p>



<p class="wp-block-paragraph">Participating faculty members have access to a licensed ChatGPT account as long as they use it. Staff members have access to Copilot accounts after taking a self-paced training course and likewise must use it to keep that access.</p>



<p class="wp-block-paragraph">Warner says these willing workers are demonstrating the benefits of AI (significant time reclamation, reduced cognitive load, improved quality of outputs, expanded professional capacity).</p>



<p class="wp-block-paragraph">SMU is now moving to a single solution and scaling AI, confident that its use will deliver returns following in the footsteps of the early adopters.</p>



<p class="wp-block-paragraph"><strong><em><strong>Interested in meeting and learning from all CIO 100 winners? Join us next week at CIO 100 Awards &amp; Conference in Frisco, TX. Limited seats remain! </strong><a href="https://tsecurity.de/weiterlesen/3685354/3713501/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer"><strong>Register here</strong></a><strong> </strong></em></strong></p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[CIO 100 Award winners spotlight IT’s power to transform]]></title>
<description><![CDATA[Each year the CIO 100 Awards showcase outstanding IT initiatives, and every year they illustrate the power and potential of technology to transform how people work, how organizations perform, and the value they offer to customers.



The 2026 cohort of winners is no different. Each one demonstrat...]]></description>
<link>https://tsecurity.de/de/3713318/it-nachrichten/cio-100-award-winners-spotlight-its-power-to-transform/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3713318/it-nachrichten/cio-100-award-winners-spotlight-its-power-to-transform/</guid>
<pubDate>Tue, 11 Aug 2026 00:51:08 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>



<p class="wp-block-paragraph">Each year the <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">CIO 100 Awards</a> showcase outstanding IT initiatives, and every year they illustrate the power and potential of technology to transform how people work, how organizations perform, and the value they offer to customers.</p>



<p class="wp-block-paragraph">The <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">2026 cohort of winners</a> is no different. Each one demonstrates how IT executives and their teams successfully move from ideation to deployment to scaling a solution for the future, overcoming challenges and driving adoption along the way to ensure their organization gets a return on its investment.</p>



<p class="wp-block-paragraph"><strong>[ Interested in meeting and learning from all CIO 100 winners? Join us next week at CIO 100 Awards &amp; Conference in Frisco, TX. Limited seats remain! </strong><a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer"><strong>Register here</strong></a><strong> ]</strong></p>



<p class="wp-block-paragraph">The winning initiatives come from a range of industries and utilize a host of technologies to achieve their goals, as is the case annually. A growing proportion of these stand-out projects leverage artificial intelligence, raising the bar on the art of the possible for all IT departments.</p>



<p class="wp-block-paragraph">The following 10 award-winning projects serve as representatives for the outstanding work done by all the 2026 honorees.</p>



<h2 class="wp-block-heading">ABB democratizes AI agent creation and deployment</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> ABB</p>



<p class="wp-block-paragraph"><strong>Project:</strong> ABBY — AI Agentic Platform for Workforce Transformation</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Vikke Kandell</a>, CIO</p>



<p class="wp-block-paragraph">IT leaders at ABB, a manufacturer, had some big hurdles to clear when it came to building an AI strategy.</p>



<p class="wp-block-paragraph">They had to overcome employee fears that AI would take away jobs, the potentially high cost of AI vendor licenses, and pressure from investors, customers, and executives to advance the use of AI in the enterprise.</p>



<p class="wp-block-paragraph">“We looked at this and asked, ‘How do we address all this?’ and build something that the company is proud of,” says Babu Kuttala, vice president of data analytics and AI.</p>



<p class="wp-block-paragraph">The answer is ABBY, an AI agentic platform that enables employees to create and deploy specialized AI agents for specific business tasks.</p>



<p class="wp-block-paragraph">To build ABBY, Kuttala and his team used best-of-breed LLMs (about 25 in total). They built a centralized orchestration layer using generative AI that integrates internal knowledge bases with external ecosystems, creating a unified platform where agents can access enterprise data, understand required actions, and execute tasks across multiple systems. And they created preconfigured skills so that employees could build agents tailored to their workflows without having to code.</p>



<p class="wp-block-paragraph">ABBY was rolled out in 2025 to 100 users but is now used by 63,000 (more than 75% of the company’s workforce, Kuttala notes) with an average of 10,000-plus workers using it daily. IT continues to add LLMs and capabilities to expand use of ABBY even further, Kuttala says.</p>



<h2 class="wp-block-heading">Belcorp modernizes manufacturing with Smart Factory</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Belcorp</p>



<p class="wp-block-paragraph"><strong>Project:</strong> QPlant — Smart Factory</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Venkat Gopalan</a>, Chief Digital, Data, and Technology Officer</p>



<p class="wp-block-paragraph">Legacy processes were limiting Belcorp’s ability to scale and compete. Its manufacturing relied on ERP-driven processes with limited shop-floor automation and weak connectivity across production, packaging, quality, and maintenance. The company depended heavily on manual records and post-process reconciliation, resulting in fragmented data, limited real-time insight, inefficiencies, and higher risks for errors.</p>



<p class="wp-block-paragraph">Smart Factory changed all that. The IT initiative reimagined how manufacturing teams work “by creating a connected, data-driven environment where production, quality, maintenance, and operations are aligned around real-time information and standardized execution,” says Venkat Gopalan, chief digital, data, and technology officer.</p>



<p class="wp-block-paragraph">At Smart Factory’s core is a manufacturing execution system that orchestrates production workflows, quality processes, and operational execution, he explains. IoT-enabled equipment integration and a centralized SCADA platform provide real-time visibility into shop-floor operations, while electronic batch records digitize production execution, strengthen traceability, and reinforce compliance by design.</p>



<p class="wp-block-paragraph">Integrating those operational technologies with the company’s enterprise platforms was another critical component of success, Gopalan says, creating a trusted flow of real-time data across manufacturing, quality, maintenance, and business systems. “This connected architecture transformed isolated data into actionable insights, enabling faster decision-making, greater operational visibility, and continuous improvement across the manufacturing lifecycle,” he adds.</p>



<p class="wp-block-paragraph">The initiative generated more than $1 million in financial benefits in its first year alone.</p>



<p class="wp-block-paragraph">“Most importantly, Smart Factory established the digital foundation for the future of manufacturing at Belcorp,” Gopalan says. “With real-time operational data and connected systems now in place, we’re well positioned to accelerate advanced analytics, AI-driven optimization, predictive maintenance, and other Industry 4.0 capabilities that will continue delivering value for years to come.”</p>



<h2 class="wp-block-heading">Cohesity replatforms post-acquisition for commercial growth</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Cohesity</p>



<p class="wp-block-paragraph"><strong>Project:</strong> Lead to Cash Replatforming Program (Veritas Integration)</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Brian Spanswick</a>, CIO</p>



<p class="wp-block-paragraph">Cohesity set an ambitious objective: Complete an enterprise-scale lead-to-cash replatform in under six months.</p>



<p class="wp-block-paragraph">That’s a tight timeline for any replatforming initiative, but Cohesity’s project had another layer of complexity. It followed Cohesity’s December 2024 acquisition of Veritas, a company twice its size in revenue, leaving Cohesity to integrate the majority of a global enterprise revenue engine into its own operating model without disrupting customers, partners, or sellers.</p>



<p class="wp-block-paragraph">“We had to bring the two companies together, merge the workforces together, and create an overall harmonized organization and operating infrastructure platform,” says Eric Brown, who as CFO and COO led the project.</p>



<p class="wp-block-paragraph">The program migrated heavily customized CRM, CPQ, PRM, ERP, and subscription platforms (some of which were “very brittle, very bespoke,” Brown says) to a unified SaaS CRM, CPQ, and ERP environment with uninterrupted selling, billing, and partner operations.</p>



<p class="wp-block-paragraph">This was no lift-and shift, Brown stresses. “It was a business process optimization project as well. We want to run very efficiently, so we questioned everything and used the migration process to simplify and streamline the business in every possible respect.”</p>



<p class="wp-block-paragraph">The initiative enabled continuity for 13,000-plus customers, protected revenue during integration, and established a scalable commercial foundation for future growth.</p>



<p class="wp-block-paragraph">Brown cites several factors that contributed to success. First, leadership was upfront about what it would take to meet the deadline, a process that involved carefully prioritizing the capabilities that would appear in the first iteration. Leadership also streamlined decision-making, establishing office hours that “ran with military precision” to handle issues. And the company selected a specialized partner, requiring its top talent be assigned to Cohesity.</p>



<h2 class="wp-block-heading">Dairyland Power goes agentic to protect field crews</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Dairyland Power Cooperative</p>



<p class="wp-block-paragraph"><strong>Project:</strong> ODIN — Organizational Effectiveness Agentic AI</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Nate Melby</a>, VP and CIO</p>



<p class="wp-block-paragraph">Dairyland Power Cooperative had amassed a large collection of field observations, incident reports, near-misses, safety rules, and work methods that could yield insights into processes and practices that could help protect its workers.</p>



<p class="wp-block-paragraph">But the insights were essentially out of reach, trapped in siloes.</p>



<p class="wp-block-paragraph">Dairyland’s organizational effectiveness team turned to CIO Nate Melby for help unlocking those insights. Melby then turned to agentic AI, recognizing that the technology could address the team’s need to make better use of its data.</p>



<p class="wp-block-paragraph">“This was about finding insights on how to work more safely,” Melby says. “It’s about preventing incidents.”</p>



<p class="wp-block-paragraph">The collaboration between the two teams created ODIN, the first agentic AI implementation of its kind in the electric utility industry.</p>



<p class="wp-block-paragraph">Focused on worker safety, ODIN autonomously connects the collective safety knowledge of the organization and delivers actionable insights directly to field crews at the moment work is planned.</p>



<p class="wp-block-paragraph">ODIN was developed through a hybrid approach that combined an agentic AI platform and Dairyland’s internal private generative AI platform called VoltWrite. ODIN leverages LLMs, retrieval-augmented generation, and a coordinated swarm of autonomous agents.</p>



<p class="wp-block-paragraph">Agents work together to analyze internal safety data, performance history, work practices, and safety rules and then synthesize the information into clear guidance on the safest way to perform specific tasks.</p>



<p class="wp-block-paragraph">ODIN has produced results, including a reduction in OSHA recordable injuries and improvements in the quality and consistency of pre-job safety briefings.</p>



<p class="wp-block-paragraph">ODIN was deployed in early 2025 for use by Dairyland’s workers in transmission construction and electrical maintenance, which are the highest-risk work areas. Dairyland is looking to expand ODIN’s use to other teams.</p>



<h2 class="wp-block-heading">Dow’s digital sustainability ledger drives low-carbon sales</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Dow</p>



<p class="wp-block-paragraph"><strong>Project:</strong> Carbon Footprint Ledger</p>



<p class="wp-block-paragraph"><strong>IT leader: </strong><a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Deb Bauler</a>, Chief Information and Digital Officer</p>



<p class="wp-block-paragraph">Executives at Dow consider the Carbon Footprint Ledger (CFL) as more than a technology or innovative carbon accounting methodology. According to Senior Global IT Director <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Jeremy Preston</a>, CFL is “a digital business capability that enables Dow to translate sustainability investments into customer value.”</p>



<p class="wp-block-paragraph">CFL transformed how Dow uses greenhouse gas emissions data. It combines a methodology aligned to international standards with an enterprise-scale digital platform. It also integrates manufacturing, supply chain, commercial, and sustainability data to generate product carbon footprints under enterprise-level governance and management at scale.</p>



<p class="wp-block-paragraph">In doing so, Preston says it creates “a trusted, traceable link between low-carbon processes and raw materials implemented across its manufacturing network and the lower-carbon products customers seek.”</p>



<p class="wp-block-paragraph">The technology team worked closely with sustainability and business teams, collaboratively developing the capabilities needed to reconstruct product genealogy, maintain end-to-end data lineage, track low-carbon attributes across interconnected manufacturing processes, and generate product carbon footprints that can support customer offerings and commercial transactions.</p>



<p class="wp-block-paragraph">CFL was built on Dow’s Integrated Data Hub and in partnership with Boston Consulting Group and Databricks.</p>



<p class="wp-block-paragraph">The core CFL platform is fully deployed and supports commercial transactions today.</p>



<p class="wp-block-paragraph">Preston says CFL “enables Dow to turn sustainability investments into customer value, commercial differentiation, and new growth opportunities.” Dow reports that it has driven hundreds of millions of dollars in low-carbon product sales in 2025 and 2026.</p>



<p class="wp-block-paragraph">The company is now expanding its use. “We are extending adoption across additional products, manufacturing networks, business segments, and customer use cases while continuing to enhance automation, analytics, and integration with commercial processes,” Preston says.</p>



<h2 class="wp-block-heading">J&amp;J transforms quality management with AI</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Johnson &amp; Johnson</p>



<p class="wp-block-paragraph"><strong>Project:</strong> Q&amp;C Strategy</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Michael Comprelli</a>, Vice President, Head of Technology, Technical Operations, and Risk; <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Joel O’Connor</a>, Head of Technology, Medtech Quality, and Compliance</p>



<p class="wp-block-paragraph">Johnson &amp; Johnson is using AI to transform quality management through its Q&amp;C Strategy.</p>



<p class="wp-block-paragraph">QuIn is an AI-powered digital assistant that fuses human expertise with machine learning, automation, and data-driven insights to boost efficiency, reliability, and worker impact. By embedding gen AI into core quality management systems processes, QuIn proactively gathers actionable insights, increases operational efficiency, and allows teams to focus on high-value, patient-centric work.</p>



<p class="wp-block-paragraph">Cora is an innovative generative AI platform that provides regulatory intelligence monitoring, impact analysis, and augmented content revision. Cora assists with document analysis, compliance comparison, stakeholder analysis, policy/standard creation, procedural/document updates, and document comparison. Cora is purpose-built for regulated environments, validating outputs against source material and offering a user experience that instills trust in the outcome.</p>



<p class="wp-block-paragraph">QuIn and Cora, which automate time-intensive tasks and democratize information access, are on track to deliver significant value, with J&amp;J reporting more than $62 million in documented true cost savings by 2028 from QuIn alone. Cora delivered $2 million in cost efficiency in 2025 and will deliver a documented cost savings of $25 million by 2028.</p>



<p class="wp-block-paragraph">“Our teams proved responsible AI can be applied meaningfully in a highly regulated environment without compromising the rigor, accountability, or human judgment that quality requires,” says Michael Comprelli, vice president, head of technology, technical operations, and risk.</p>



<p class="wp-block-paragraph">He continues, saying that J&amp;J “moved these ideas beyond experimentation and into products that employees use in their daily work. We did that by bringing together Quality expertise, product management, data engineering, architecture, cybersecurity, user-experience design and AI engineering around a common purpose.”</p>



<h2 class="wp-block-heading">JLL brings intelligent automation to business services</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> JLL</p>



<p class="wp-block-paragraph"><strong>Project:</strong> Business Service Digitization</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Pinak Dash</a>, Global Head of JLL Business Services and Legal Technologies</p>



<p class="wp-block-paragraph">JLL launched its digitization initiative to drive process redesign as well as systematic AI and RPA deployment across JLL Business Services (JBS).</p>



<p class="wp-block-paragraph">The initiative was designed to address inefficiencies that hampered scalability and competitive positioning. It was also designed to eliminate manual processes that consumed thousands of hours across finance, HR, legal, procurement, marketing, research, IT, and lease administration.</p>



<p class="wp-block-paragraph">Pinak Dash, global head of JBS and legal technologies, says the digitization initiative had a dual-strategy combining traditional digitization with generative AI innovation to hundreds of processes.</p>



<p class="wp-block-paragraph">JLL lists three innovations critical to the program’s success.</p>



<p class="wp-block-paragraph">First is a hybrid platform that integrates RPA with JLL’s proprietary AI platform called Falcon, which created intelligent automation that adapts and learns. It enables real-time process automation, intelligent document processing with automated extraction/validation, and smart decision-making for continuously optimizing workflows.</p>



<p class="wp-block-paragraph">The second innovation is its use of ProHance for real-time process monitoring and enabling of data-driven optimization. Sensors capture granular productivity metrics, identify bottlenecks, and provide actionable insights for continuous improvement across automated and manual processes.</p>



<p class="wp-block-paragraph">Third is its custom AI assistants and transaction agents. Falcon-powered assistants provide intelligent knowledge search while specialized agents execute complex transactions across enterprise SaaS platforms. These handle multisystem workflows, reducing human touchpoints while maintaining accuracy and compliance.</p>



<p class="wp-block-paragraph">Dash says the initiative has delivered quantifiable benefits through improved efficiency, accuracy, and quality of services provided to clients.</p>



<p class="wp-block-paragraph">“The initiative delivers on our business goals, makes us more efficient, provides customers better service, and it opens up the capabilities and bandwidth of our people to do what they like to do and to find innovative ways to serve our business,” he adds.</p>



<h2 class="wp-block-heading">Nationwide partnership platform delivers efficiencies, business growth</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Nationwide</p>



<p class="wp-block-paragraph"><strong>Project:</strong> Enterprise Digital Platform (EDP)</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Michael Carrel</a>, EVP and CTO</p>



<p class="wp-block-paragraph">Nationwide’s new Enterprise Digital Platform (EDP) gives the company “a scalable way to connect with external partners quickly, securely, and consistently across all areas of our business,” says company EVP and CTO Michael Carrel.</p>



<p class="wp-block-paragraph">He explains that “instead of treating every integration as a custom effort, EDP creates a common front door for digital products, documentation, onboarding and governance.”</p>



<p class="wp-block-paragraph">That innovation has produced better experiences for the company’s partners. It saves time for Nationwide teams, partners, and customers. And it supports faster launch times for new products and enables growth across the business.</p>



<p class="wp-block-paragraph">“EDP changed the model from fragmented, point-to-point integrations into an enterprise platform built around reusable digital products. That shift lets us support a range of integration options in one governed environment, meet partners at different stages of technical maturity, and add new capabilities over time without redesigning every relationship from scratch,” Carrel explains.</p>



<p class="wp-block-paragraph">EDP uses cloud-native microservices, role-based access control, and advanced analytics. Nationwide IT created modular microservices to make EDP more scalable, resilient, and adaptable. And IT decoupled it from infrastructure-specific dependencies so that it would be a platform-agnostic developer portal. That, Carrel says, reduced operational constraints across environments.</p>



<p class="wp-block-paragraph">Additionally, IT shifted from a user-specific model to role-based access, which improved security, simplified administration, and better served the needs of different audiences.</p>



<p class="wp-block-paragraph">Meanwhile, robust analytics delivers visibility into platform usage and performance, which Carrel says helps ensure Nationwide continuously evolves the platform based on measurable outcomes.</p>



<p class="wp-block-paragraph">The core platform is fully deployed, with Nationwide planning to expand it.</p>



<p class="wp-block-paragraph">“Our Enterprise Digital Platform is more than a piece of technology,” Carrel notes, “it represents a strategic enabler to support growth objectives across Nationwide’s businesses.”</p>



<h2 class="wp-block-heading">PITT Ohio fast-tracks shipment requests with AI assist</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> PITT Ohio</p>



<p class="wp-block-paragraph"><strong>Project:</strong> No Touch Email (N@TE AI)</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Scott Sullivan</a>, President and CEO (formerly CIO)</p>



<p class="wp-block-paragraph">As PITT Ohio started its AI journey in 2024, the mandate was clear: Use the technology to solve “real problems,” says Ryan Carner, director of enterprise IT solutions.</p>



<p class="wp-block-paragraph">“We wanted to hit the ground running and find a problem that was solvable,” Carner says, noting that the company also wanted to use the experience to build in-house AI skills. “The idea was to find a business case for AI that would be our first but not the only one.”</p>



<p class="wp-block-paragraph">PITT Ohio leaders decided to tackle what Carner describes as a “mundane but very important task for how our business operates”: handling emails to the customer service team.</p>



<p class="wp-block-paragraph">The need was significant. Customer service representatives were manually processing hundreds of pickup request emails daily, each requiring five to 15 minutes to interpret and re-enter shipment details into the company’s transportation management system (TMS). The emails were complicated, containing a lot of information submitted in nonstandardized ways and varying formats. This repetitive task consumed valuable time, introduced errors, and delayed customer response.</p>



<p class="wp-block-paragraph">N@TE uses generative AI and natural language processing to transform unstructured email content into structured pickup orders automatically and in real-time. N@TE scans incoming emails, extracts key shipment data, and creates orders directly in the TMS via API integration. It operates seamlessly within existing workflows, requiring no change in customer behavior or retraining of staff.</p>



<p class="wp-block-paragraph">PITT Ohio deployed N@TE in 2025, and the company also secured a patent for the product that year. N@TE has produced a 30-60X increase in processing speed, 99% accuracy in extracting and populating order data, and a 70% reduction in handling costs per pickup order.</p>



<h2 class="wp-block-heading">SMU builds AI adoption through grassroots ambassador program</h2>



<p class="wp-block-paragraph"><strong>Organization:</strong> Southern Methodist University</p>



<p class="wp-block-paragraph"><strong>Project:</strong> Scaling AI Without Scaling AI: Organizational AI Scaling Through Willingness</p>



<p class="wp-block-paragraph"><strong>IT leader:</strong> <a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer">Jason Warner</a>, Associate CIO</p>



<p class="wp-block-paragraph">Like executives in most organizations, leaders at Southern Methodist University encountered mixed attitudes about AI. Some workers had little interest in using the tech, others were afraid it would take jobs, still others were curious about what it could do.</p>



<p class="wp-block-paragraph">Associate CIO Jason Warner and other leaders decided to leverage that last group, believing the best way to get SMU faculty and staff to embrace AI was to use enthusiasts to help smooth the way.</p>



<p class="wp-block-paragraph">So, instead of treating AI as a conventional technology rollout, Warner and his colleagues built opt-in communities of practice known as the AI Coalition of the Willing and Operation Copilot.</p>



<p class="wp-block-paragraph">The goal, Warner says, was to build institutional capability, reduce risk, and generate momentum.</p>



<p class="wp-block-paragraph">“We knew the fastest way to scale AI was to scale the willingness of people to use the technology, and not talking to people about cost savings and the like,” Warner says, adding that willing users as great ambassadors and evangelists who showcase in formal and informal ways the technology’s potential for hesitant or skeptical colleagues.</p>



<p class="wp-block-paragraph">Participating faculty members have access to a licensed ChatGPT account as long as they use it. Staff members have access to Copilot accounts after taking a self-paced training course and likewise must use it to keep that access.</p>



<p class="wp-block-paragraph">Warner says these willing workers are demonstrating the benefits of AI (significant time reclamation, reduced cognitive load, improved quality of outputs, expanded professional capacity).</p>



<p class="wp-block-paragraph">SMU is now moving to a single solution and scaling AI, confident that its use will deliver returns following in the footsteps of the early adopters.</p>



<p class="wp-block-paragraph"><strong><em><strong>Interested in meeting and learning from all CIO 100 winners? Join us next week at CIO 100 Awards &amp; Conference in Frisco, TX. Limited seats remain! </strong><a href="https://tsecurity.de/weiterlesen/3685171/3713318/cio-100-award-winners-spotlight-its-power-to-transform/" target="_blank" rel="noopener noreferrer"><strong>Register here</strong></a><strong> </strong></em></strong></p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[7 Anwendungsfälle für Physical AI]]></title>
<description><![CDATA[width="1024" height="576" sizes="auto, (max-width: 1024px) 100vw, 1024px">Humanoide Roboter wie Figure 03, den BMW im Werk Spartanburg in der Logistik einsetzt, sind nur ein Beispiel für Physical AI.BMW AG



Die nächste große KI-Welle wird kein Chatbot auf Ihrem Laptop sein oder ein Agent, der i...]]></description>
<link>https://tsecurity.de/de/3710307/it-security-nachrichten/7-anwendungsfaelle-fuer-physical-ai/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3710307/it-security-nachrichten/7-anwendungsfaelle-fuer-physical-ai/</guid>
<pubDate>Fri, 07 Aug 2026 23:49:53 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure class="wp-block-image size-large is-resized"> width="1024" height="576" sizes="auto, (max-width: 1024px) 100vw, 1024px"&gt;<figcaption class="wp-element-caption">Humanoide Roboter wie Figure 03, den BMW im Werk Spartanburg in der Logistik einsetzt, sind nur ein Beispiel für Physical AI.</figcaption></figure><p class="imageCredit">BMW AG</p></div>



<p class="wp-block-paragraph">Die nächste große KI-Welle wird kein Chatbot auf Ihrem Laptop sein oder ein Agent, der im Hintergrund Besprechungsnotizen automatisch in Projekttickets umwandelt. Stattdessen wird sie aus KI bestehen, die Geräte steuert, sich bewegt und mit ihrer Umgebung interagiert.</p>



<p class="wp-block-paragraph">Unter <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">Physical AI</a> versteht man die Integration von künstlicher Intelligenz (KI) in autonome Systeme, wodurch diese ihre Umgebung wahrnehmen und komplexe Handlungen in der physischen Welt ausführen können. Der Markt für Physical AI wird derzeit auf etwa 92 Milliarden Dollar geschätzt und soll <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">laut PwC</a> bis 2030 auf über 489 Milliarden Dollar anwachsen.</p>



<p class="wp-block-paragraph">Für viele Menschen weckt der Begriff „physische KI“ Bilder von Robotern, die in einer Fabrikhalle Teile montieren, oder von selbstfahrenden Autos. Beide Beispiele gehören tatsächlich zu den wichtigsten Anwendungsfällen. Physical AI kommt aber auch in Sicherheitskameras, Ampeln, Inspektionsrobotern, medizinischen Geräten und vielen weiteren Bereichen zum Einsatz.</p>



<h2 class="wp-block-heading">Was gute Physical-AI-Anwendungsfälle auszeichnet</h2>



<p class="wp-block-paragraph">IT-Führungskräfte sollten bei der Suche nach Einsatzmöglichkeiten für physische KI über humanoide Rotober hinausdenken, erklärt <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">Adnan Masood</a>, Chief-AI Architect beim Anbieter für digitale Transformation UST. „Ich gebe CIOs meist den Rat: Lassen Sie sich nicht vom Hype um humanoide Roboter blenden. Der kurzfristige Mehrwert liegt in adaptiver Automatisierung in variablen Umgebungen – dort, wo sich Bedingungen verändern, Menschen und Maschinen gemeinsam arbeiten und Ausfallzeiten hohe Kosten verursachen.“</p>



<p class="wp-block-paragraph">Der ideale Einsatzort für Physical AI seien jedoch Aufgaben, die sicher, wiederholt und nachvollziehbar ausgeführt werden können und sich in bestehende Sicherheits- und Compliance-Vorgaben integrieren lassen, fügt Masood hinzu.</p>



<p class="wp-block-paragraph">Damit Physical AI entsprechende Wirkung entfalten kann, müssten einige Voraussetzungen erfüllt sein, ergänzt <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">Vikram Venkat</a>, Investor für physische KI-Systeme bei Cota Capital.</p>



<p class="wp-block-paragraph">An erster Stelle stehe ein hoher Arbeitskräftebedarf – etwa, wenn bereits Fachkräftemangel herrsche, absehbar sei oder wenn Tätigkeiten für Menschen gefährlich sind. Zudem sollte die Einsatzumgebung vergleichsweise kontrolliert und überschaubar sein, da heutige Physical-AI-Plattformen mit stark wechselnden oder unvorhersehbaren Bedingungen noch Schwierigkeiten haben. Schließlich sollte die Aufgabe wiederholbar sein, oft in großem Umfang, und klare, messbare Ergebnisse liefern, fügt er hinzu.</p>



<p class="wp-block-paragraph">Für den kurzfristigen Erfolg nennt Venkat zwei weitere wichtige Kriterien:</p>



<ul class="wp-block-list">
<li><strong>Einfache Implementierung</strong>: Die Einführung sollte einfach sein und nur minimale Änderungen an bestehenden Prozessen, zusätzliche Infrastruktur oder Integrationen in bestehende Systeme erfordern.</li>



<li><strong>Human in the Loop</strong>: Mitarbeiter, die in den Prozess eingebunden sind, sollten jederzeit in der Lage sein, Fehler zu korrigieren.</li>
</ul>



<h2 class="wp-block-heading">Die 7 wichtigsten Physical-AI-Anwendungsfälle</h2>



<p class="wp-block-paragraph">Trotz dieser Einschränkungen sei das Potenzial der physischen KI enorm, betont <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">Albert Liu</a>, Gründer und CEO des Anbieters von Edge-AI-Lösungen Kneron.</p>



<p class="wp-block-paragraph">„Die meisten Menschen verbinden Physical AI zunächst mit Robotern –einfach, weil diese bislang die sichtbarste Form dieser Technologie sind.“, bemerkt er.</p>



<p class="wp-block-paragraph">Bei physischer KI gehe es jedoch nicht nur um Maschinen, die sich bewegen, sondern um Umgebungen, die intelligent werden.</p>



<p class="wp-block-paragraph">Nachfolgend sieben vielversprechende Anwendungsbereiche für physische KI-Systeme.</p>



<ol class="wp-block-list">
<li><strong>Fertigungsroboter</strong></li>
</ol>



<p class="wp-block-paragraph">Wer beim Stichwort Physical AI an Roboter denkt, die Autos oder andere Produkte herstellen, liegt gar nicht so falsch: Tatsächlich zählt dieser Bereich zu den etabliertesten Anwendungsfeldern und mehrere Hersteller bieten bereits industrielle Robotersysteme an. Den Marktvolumen für Industrierobotik schätzt <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">Mordor Intelligence</a> für 2026 auf 54,3 Milliarden Dollar. Bis 2031 gehen die Analysten davon aus, dass dieser Wert auf 94,4 Milliarden Dollar anwächst.</p>



<p class="wp-block-paragraph">Ein konkretes Beispiel für diesen Use Case liefert der Automobilhersteller BMW. Das Unternehmen setzt in einem Werk in den USA humanoiden Roboter ein, die unter anderem Schweißarbeiten an Fahrzeugkomponenten <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">übernehmen</a>.</p>



<p class="wp-block-paragraph"><strong>2. Qualitätsprüfung und vorausschauende Instandhaltung</strong></p>



<p class="wp-block-paragraph">Physische KI in Produktionsumgebungen wird längst nicht mehr ausschließlich für die Montage eingesetzt. Ebenso wichtig sind Anwendungen im <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">Materialtransport</a>, bei der automatisierten Qualitätskontrolle sowie bei der Fehlererkennung. Insbesondere Arbeitskräftemangel und gut strukturierte Produktionsumgebungen begünstigten den Einsatz solcher Systeme, wie Venkat anmerkt.</p>



<p class="wp-block-paragraph">Ein weiteres ideales Einsatzgebiet ist die vorausschauende Wartung (Predictive Maintenance). KI könne kontinuierlich überwachen, ob die Software, welche Maschinen steuert, ordnungsgemäß funktioniert, erklärt UST-Experte Adnan Masood. „Agentenbasierte Pipelines sind mittlerweile in der Lage, Hardware-Schaltpläne und Chip-Pinbelegungen nativ auszulesen, automatisch Regressionstests zu erzeugen, die Ingenieure früher von Hand programmiert haben, und Live-Telemetriedaten der Anlagen mit digitalen Zwillingen zu vergleichen“ führt er aus. Dadurch ließen sich Firmware-Fehler und Probleme bei der Signalübertragung erkennen, bevor sie die Produktion beeinträchtigen.</p>



<p class="wp-block-paragraph">Ein prominentes Beispiel ist der vierbeinige Roboter „Spot“ von Boston Dynamics. Nach Angaben des Unternehmens sind bereits Tausende dieser Roboter in mehr als 40 Ländern im Einsatz – unter anderem bei Intel, Chevron, Michelin und Cargill. „Spot“ automatisiert Industrieinspektionen, unterstützt die vorausschauende Wartung und übernimmt Sicherheitsrundgänge.</p>



<p class="wp-block-paragraph">Boston Dynamics vertreibt zudem „Stretch“, der das Entladen von Anhängern und Containern automatisiert, sowie „Atlas“, einen humanoiden Roboter, der Produkte heben, sortieren und montieren kann.</p>



<p class="wp-block-paragraph">Auch kamerabasierte Physical-AI-Systeme gewinnen an Bedeutung. Intelligente Kameras und Sensoren können Produktionsprozesse überwachen und Qualitätsprüfungen direkt an der Fertigungslinie durchführen.</p>



<p class="wp-block-paragraph"><a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">Parm Sandhu</a>, Group Vice President für Enterprise AI, Edge Computing und Digital Innovation bei NTT DATA, erläutert:</p>



<p class="wp-block-paragraph">„Unternehmen möchten sicherstellen, dass Produkte bereits beim ersten Fertigungsdurchlauf korrekt hergestellt werden. Wir setzen Foundation Models ein, die mit Kameras verbunden sind und durch selbstständiges Lernen sehr schnell die Standardabläufe einer Produktionsstation verstehen.“</p>



<p class="wp-block-paragraph"><strong>3. Autonome Fahrzeuge und Drohnen</strong></p>



<p class="wp-block-paragraph">Die Vision selbstfahrender Autos prägt seit Jahren die öffentliche Wahrnehmung von physischer KI. Bereits 2025 hatte der Markt für autonome Fahrzeuge – unabhängig vom allgemeinen Markt für Physical AI –ein Volumen von mehr als 200 Milliarden Dollar, <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">so Global Market Insights</a>.</p>



<p class="wp-block-paragraph">Doch es dreht sich dabei nicht nur um Autos: Autonome Landmaschinen, darunter <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">Traktoren, Erntemaschinen und Drohnen</a>, stellen einen wachsenden Markt dar, wobei die Schätzungen zur Marktgröße stark variieren. Global Market Insights <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">schätzte den Markt</a> im Jahr 2025 auf 70,9 Milliarden Dollar. Bis 2035 soll er den Auguren zufolge auf 144,7 Milliarden Dollar anwachsen.</p>



<p class="wp-block-paragraph">Auch Drohnen, die von KI gesteuert werden, eröffnen vielfältige Anwendungsmöglichkeiten. Dazu gehören militärische Anwendungen ebenso wie Lieferdienste für Lebensmittel oder Pakete. Unternehmen wie Amazon experimentieren bereits seit einigen Jahren mit Drohnenlieferungen.</p>



<p class="wp-block-paragraph">Eine Anwendung, die eine Brücke zwischen den Anwendungsfällen für autonome Fahrzeuge und der Fertigungsindustrie schlägt, sind selbstfahrende Gabelstapler. NTT DATA arbeitet gemeinsam mit dem Gabelstaplerhersteller Hyster-Yale daran, die Fahrzeuge mit autonomen Fahrfunktionen auszustatten – unter anderem als Reaktion auf den Arbeitskräftemangel, so Sandhu:</p>



<p class="wp-block-paragraph">„Wenn man an die Fertigungsindustrie denkt, wurde nahezu jedes Produkt irgendwann einmal von einem Gabelstapler bewegt – oder zumindest seine Komponenten. Doch immer weniger Menschen möchten Gabelstapler fahren. Das ist ein enormes Problem.“</p>



<p class="wp-block-paragraph"><strong>4. Flotten- und Lagerkoordination</strong></p>



<p class="wp-block-paragraph">Physical AI, integriert in LKWs, Roboter und intelligente Regale, kann den Material- und Warenfluss vom Lager bis zum Endkunden verfolgen und besser koordinieren. Roboter <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">kommissionieren, sortieren und transportieren</a> dabei Güter, während KI die Telemetriedaten von Fahrzeugflotten nutzt, um Transportrouten besser zu planen.</p>



<p class="wp-block-paragraph">KI-Modelle sind mittlerweile in der Lage, Tausende autonomer mobiler Roboter über Fulfillment-Netzwerke hinweg zu koordinieren – was Masood von UST als eine Art „Flugsicherung für Roboter“ bezeichnet.</p>



<p class="wp-block-paragraph">Die eigentliche Intelligenz befinde sich dabei nicht im einzelnen Roboter, sondern in der Koordinationsschicht, hält er fest. Diese entscheide, welcher Roboter welche Aufgabe übernimmt, lege die Reihenfolge der Aufträge fest und verhindere Konflikte zwischen den Fahrzeugen. „Sie lässt sich in einer Weise skalieren, wie es die Programmierung einzelner Roboter niemals könnte“, so Masood.</p>



<p class="wp-block-paragraph">Dass diese Technologie inzwischen produktiv eingesetzt wird, zeigt das Beispiel des Unternehmens Symbotic. Eigenen Angaben zufolge betreibt der Anbieter von physischer KI für Lagerhäuser weltweit 22.000 autonome mobile Roboter, die allein im Jahr 2025 zusammen mehr als 200 Millionen Meilen zurücklegten. Der aktivste einzelne Roboter fuhr dabei knapp 84.000 Kilometer – mehr als zweimal um die Erde.</p>



<p class="wp-block-paragraph"><strong>5.</strong> <strong>Überwachung und physische Sicherheit</strong></p>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure class="wp-block-image size-large"><img loading="lazy" src="https://b2b-contenthub.com/wp-content/uploads/2025/01/FIXED_1-spot-packaging-inspection.jpg?quality=50&amp;strip=all&amp;w=1024" alt="BostonDynamics" class="wp-image-3806049" width="1024" height="683" sizes="auto, (max-width: 1024px) 100vw, 1024px"><figcaption class="wp-element-caption">Patrouillen-“Hund” Spot im Einsatz</figcaption></figure><p class="imageCredit">BostonDynamics</p></div>



<p class="wp-block-paragraph">Die Einsatzmöglichkeiten physischer KI im Bereich der physischen Sicherheit reichen weit über Patrouillenroboter wie Spot von Boston Dynamics hinaus. Immer häufiger werden Videokameras, Sensoren und weitere Sicherheitssysteme mithilfe von KI miteinander vernetzt. Dadurch entsteht eine kontinuierliche, intelligente Überwachung von Gebäuden, Betriebsgeländen oder ganzen Campusarealen.</p>



<p class="wp-block-paragraph">Ein Beispiel dafür liefern Artificial Intelligence Technologies Solutions und die Tochtergesellschaft Robotic Assistance Devices (RAD). Beide Unternehmen verbinden Kameras, stationäre Sicherheitskomponenten und autonome Fahrzeuge zu einem umfassenden Sicherheitsnetzwerk.</p>



<p class="wp-block-paragraph">Kernstück ist die agentenbasierte KI-Plattform „SARA“ (Speaking Autonomous Responsive Agent). Diese ist darauf ausgelegt ist, Kameras, fest installierte Sicherheitsvorrichtungen, autonome Patrouillenfahrzeuge, Beleuchtung, Lautsprecher, Überwachungssysteme und menschliches Sicherheitspersonal zu koordinieren.</p>



<p class="wp-block-paragraph">SARA kann eingehende Sicherheitsmeldungen analysieren, Vorfälle verifizieren, direkt mit Personen vor Ort kommunizieren und – sofern freigegeben – geeignete Reaktionen automatisch einleiten. Nach Angaben der Unternehmen lassen sich dadurch wertvolle Minuten gegenüber einer ausschließlich menschlichen Reaktion einsparen.  </p>



<p class="wp-block-paragraph">Ein weiteres Beispiel für den Einsatz von Physical AI im Sicherheitsbereich sind intelligente Metalldetektoren mit integrierter KI. Das Unternehmen Athena Security bietet etwa Körperscanner an, die nach eigenen Angaben verschiedenste Waffen – darunter Rasierklingen und kleine Messer – mit hoher Genauigkeit erkennen können.</p>



<p class="wp-block-paragraph"><strong>6. Intelligente Gebäude und Infrastruktur</strong></p>



<p class="wp-block-paragraph">Unternehmen könnten Physical AI nutzen, um eine Vielzahl von Kennzahlen innerhalb von Gebäuden, in Versorgungsnetzen und der TK-Infrastruktur zu überwachen, wie Masood von UST anmerkt. Die KI erkenne Auffälligkeiten und könne automatisch Warnmeldungen auslösen, Sicherheitsmaßnahmen einleiten oder Gebäudeparameter wie Klima- oder Energiesteuerung anpassen.</p>



<p class="wp-block-paragraph">Auch im Gesundheitswesen gewinnt diese Technologie an Bedeutung. Krankenhäuser nutzen physische KI zunehmend zur Koordination von Pflege- und Behandlungsprozessen, während Netzbetreiber KI-gestützte selbstheilende Netzwerke einsetzen, die Störungen eigenständig erkennen und beheben können.</p>



<p class="wp-block-paragraph">Liu von Kneron erwartet darüber hinaus sogenannte intelligente Concierge-Systeme in Hotels, Flughäfen und Krankenhäusern, die Wegbeschreibungen geben, Identitäten überprüfen und Dienstleistungen koordinieren.</p>



<p class="wp-block-paragraph">Seiner Einschätzung nach wird KI innerhalb des nächsten Jahrzehnts nahezu jeden physischen Raum durchdringen – von Drive-in-Schaltern über Restaurants und Fabriken bis hin zu Bürogebäuden.</p>



<p class="wp-block-paragraph">„Menschen werden erwarten, dass eine Sicherheitskamera Absichten erkennt, anstatt lediglich Bewegungen zu registrieren; oder dass ein Krankenhauszimmer subtile Veränderungen im Gesundheitszustand eines Patienten erkennt, bevor ein Alarm ausgelöst wird.“, so Liu.</p>



<p class="wp-block-paragraph">Zur neuen Normalität gehöre außerdem bald, dass ein Verkaufsregal seinen Bestand selbst verwaltet oder dass ein Gebäude Energieverbrauch, Sicherheit und Auslastung kontinuierlich optimiert.</p>



<p class="wp-block-paragraph"><strong>7. Smart Cities</strong></p>



<p class="wp-block-paragraph">Auch Städte beginnen zunehmend, physische KI in ihre Infrastruktur zu integrieren. Intelligente Systeme werden beispielsweise in Verkehrsleitsystemen, Ampelanlagen und Überwachungskameras eingesetzt, um Verkehrsflüsse zu analysieren und kommunale Dienstleistungen effizienter zu organisieren.</p>



<p class="wp-block-paragraph">So können etwa KI-gestützte Verkehrssysteme den Verkehrsfluss verbessern, Kreuzungen überwachen und die Verkehrssicherheit erhöhen, ohne ausschließlich auf menschliche Beobachtung angewiesen zu sein.</p>



<p class="wp-block-paragraph">Ein Beispiel dafür ist der Sensorhersteller Ouster, der gemeinsam mit dem Verkehrsministerium des US-Bundesstaates New Jersey 42 Kreuzungen mit LiDAR-Sensoren ausstattete. Ziel war es, im Vorfeld der Fußball-Weltmeisterschaft Verkehrs- und Fußgängerstaus besser zu erkennen und zu steuern.</p>



<p class="wp-block-paragraph">Ein weiteres Beispiel stammt von NTT DATA, das mit der Stadt Brownsville (Texas) an einem stadtweiten KI-gestützten Benachrichtigungssystem arbeitet. Dieses informiert beispielsweise städtische Mitarbeiter, wenn Abfallbehälter in Parks geleert werden müssen, und unterstützt Polizeibeamte beim Erstellen von Einsatzberichten. (mb)</p>



<p class="wp-block-paragraph">Dieser Artikel basiert auf einem <a href="https://tsecurity.de/weiterlesen/3682160/3710307/7-anwendungsfaelle-fuer-physical-ai/" target="_blank" rel="noopener noreferrer">Beitrag</a> von CIO.com.</p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[7 use cases for leveraging AI in the physical world]]></title>
<description><![CDATA[The next big AI wave won’t be a chatbot in your laptop, or an agent that works behind the scenes to turn meeting notes into project tickets, but AI that takes control of devices that move and interact with the environment.



Physical AI can be defined as the integration of AI into autonomous sys...]]></description>
<link>https://tsecurity.de/de/3707682/it-security-nachrichten/7-use-cases-for-leveraging-ai-in-the-physical-world/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3707682/it-security-nachrichten/7-use-cases-for-leveraging-ai-in-the-physical-world/</guid>
<pubDate>Thu, 06 Aug 2026 12:51:44 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>



<p class="wp-block-paragraph">The next big AI wave won’t be a chatbot in your laptop, or an <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">agent that works behind the scenes</a> to turn meeting notes into project tickets, but AI that takes control of devices that move and interact with the environment.</p>



<p class="wp-block-paragraph"><a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">Physical AI can be defined</a> as the integration of AI into autonomous systems, allowing them to perceive the environment around them and perform complex actions in the physical world. The <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">physical AI</a> market, currently valued at about $92 billion, is <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">projected by PwC</a> to surpass $489 billion by 2030.</p>



<p class="wp-block-paragraph">For many people, physical AI may conjure images of robots building widgets on a factory floor, or a self-driving car. Both examples are among the top use cases for physical AI, but physical AI is also being integrated into security cameras, traffic lights, inspection robots, medical devices, and more.</p>



<h2 class="wp-block-heading">What makes a strong use case for physical AI</h2>



<p class="wp-block-paragraph">IT leaders thinking about how to use physical AI should think beyond the <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">human-shaped robots</a> that generate a lot of attention, says <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">Adnan Masood</a>, chief AI architect at digital transformation provider UST.</p>



<p class="wp-block-paragraph">“I usually have one caution for CIOs — skip the humanoid theater,” he says. “The near-term advantage is adaptive automation in variable environments where conditions change, humans share the space, and downtime is expensive.”</p>



<p class="wp-block-paragraph">The sweet spot for physical AI is when it can run safely and repeatedly and can be audited within existing safety and compliance regimes, he adds.</p>



<p class="wp-block-paragraph">For physical AI to make a big impact, a handful of conditions must exist, adds <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">Vikram Venkat</a>, investor in physical AI systems at Cota Capital.</p>



<p class="wp-block-paragraph">First, there should be a major labor component, such as existing or expected labor shortages or conditions that make the work dangerous for humans, he says. In addition, the environment should be relatively constrained, because physical AI platforms generally aren’t yet proficient at handling highly variable environments.</p>



<p class="wp-block-paragraph">Finally, the task should be repeatable, often at high volumes, and have clear measurable outcomes, he adds.</p>



<p class="wp-block-paragraph">In the short term, a couple of other conditions should exist, Venkat says. First, deployments should be simple, and require minimal changes to existing processes, additional infrastructure, or integrations into existing systems. Second, humans in the loop should be able to correct errors.</p>



<h2 class="wp-block-heading">Top use cases for physical AI</h2>



<p class="wp-block-paragraph">Despite those constraints, physical AI’s potential is huge, says <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">Albert Liu</a>, founder and CEO of edge AI solutions vendor Kneron.</p>



<p class="wp-block-paragraph">“Most people think physical AI begins with robots, which is simply the example our minds go to since it has been the most visible until now,” he notes. “But physical AI isn’t just about the typical answer — machines that move — it’s about environments that become intelligent.”</p>



<p class="wp-block-paragraph">With several caveats in mind, here are seven promising uses for physical AI systems.</p>



<h3 class="wp-block-heading">Manufacturing robots</h3>



<p class="wp-block-paragraph">When thinking about physical AI, many people may envision robots manufacturing cars or other products. That’s certainly happening, with several vendors offering builder robots for sale, and with the industrial robotics market valued at $54.3 billion in 2026, growing to $94.4 billion by 2031, <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">according to Mordor Intelligence</a>.</p>



<p class="wp-block-paragraph">One example of robots building products comes from car maker <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">BMW, which has used a humanoid robot</a> to weld parts together at a plant in the US.</p>



<h3 class="wp-block-heading">Quality inspection and predictive maintenance</h3>



<p class="wp-block-paragraph">Physical AI deployed inside manufacturing environments isn’t just being used to assemble products. The technology is also being used for material handling and automated quality inspection and defect checking, with labor shortages and constrained environments driving use, notes Venkat.</p>



<p class="wp-block-paragraph"><a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">Predictive maintenance</a> is also a sweet spot for physical AI in manufacturing. AI can be used to check that the software powering equipment is working correctly, says UST’s Masood.</p>



<p class="wp-block-paragraph">“Agentic pipelines now read hardware schematics and chip pinouts natively, generate the regression suites engineers once scripted by hand, and compare live equipment telemetry against digital twins to catch firmware regressions and signal-integrity faults before a production run,” he says.</p>



<p class="wp-block-paragraph">Boston Dynamics’ four-legged Spot is an example of a marriage between robotics and AI, with the company saying thousands of robots have been deployed across 40 countries at companies such as Intel, Chevron, Michelin, <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">and Cargill</a>. Spot is used to automate industrial inspections, conduct predictive maintenance, and go on security patrols.</p>



<p class="wp-block-paragraph">Boston Dynamics also sells Stretch, which automates the unloading of trailers and containers, and Atlas, a humanoid robot that can lift, sort, and assemble products.</p>



<p class="wp-block-paragraph">Physical AI embedded into cameras and sensors can provide quality control inspections on factory floors, notes <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">Parm Sandhu</a>, group vice president for enterprise AI, edge computing, and digital innovation at IT solutions provider NTT DATA.</p>



<p class="wp-block-paragraph">“They want to make sure the products built right the first time,” he says. “We use a foundation model, set up with cameras and trained in self-learning, so it very can very quickly learn standard operating procedure for one factory station.”</p>



<h3 class="wp-block-heading">Autonomous vehicles and drones</h3>



<p class="wp-block-paragraph">The promise of self-driving cars entered the public consciousness several years ago, and the market, separate from the physical AI market, was worth more than <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">$200 billion in 2025</a>, according to Global Market Insights.</p>



<p class="wp-block-paragraph">Autonomous taxis are also gaining momentum, with Waymo and Tesla <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">launching robotaxi experiments</a> in limited areas in 2025. Uber also has huge plans for robotaxis.</p>



<p class="wp-block-paragraph">But the autonomous vehicle market extends far beyond cars driving down the highway. Autonomous farm equipment, including <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">tractors, harvesters, and drones</a>, represent a growing market, with market size estimates varying wildly. Global Market Insights <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">estimated the market</a> to be worth $70.9 billion in 2025, with projections for it to reach $144.7 billion by 2035.</p>



<p class="wp-block-paragraph">Drones can also be operated by an AI, leading to all kinds of applications, including military uses and food and package delivery services. Amazon and other companies have experimented with drone delivery services in recent years, and DoorDash announced in late July that it <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">would jump into the market</a>.</p>



<p class="wp-block-paragraph">One use that staddles the autonomous vehicle and manufacturing use cases involves self-driving forklifts. NTT DATA has worked with forklift manufacturer Hyster-Yale to install self-driving capabilities into the vehicles, in part a response to labor shortages, Sandhu says.</p>



<p class="wp-block-paragraph">“If you think about manufacturing, pretty much everything you touch in that world was lifted by a forklift somewhere or components were lifted by a forklift somewhere,” he says. “But people don’t want to drive forklifts, and that’s a huge problem.”</p>



<h3 class="wp-block-heading">Fleet and warehouse coordination</h3>



<p class="wp-block-paragraph">Physical AI, built into trucks and smart shelves, can track and better coordinate the movement of materials and products, from the warehouse to the end customer. Physical AI, installed in robots, <a href="https://tsecurity.de/weiterlesen/3679536/3707682/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">can pick, sort, and transport</a> goods. AI can use fleet telemetry to optimize routes in the shipping fleet.</p>



<p class="wp-block-paragraph">AI models can now orchestrate thousands of autonomous mobile robots across fulfillment networks, what UST’s Masood calls “air traffic control for robots.”</p>



<p class="wp-block-paragraph">The AI intelligence sits in the coordination layer that routes, sequences, and removes conflicts in the fleet, he adds. “It scales in ways single-robot programming never could,” notes.</p>



<p class="wp-block-paragraph">Physical AI has moved beyond pilots and is operating at enterprise scale in warehouses, according to Symbotic, a warehouse physical AI vendor.</p>



<p class="wp-block-paragraph">The company’s fleet of 22,000 autonomous mobile robots that traveled more than 200 million miles in 2025, with one robot traveling more than 52,000 miles, or more than twice the distance around the Earth, the company says.</p>



<h3 class="wp-block-heading">Surveillance and physical security</h3>



<p class="wp-block-paragraph">Physical AI’s application to physical security includes roving robots like Boston Dynamics’ Spot, but it also allows organizations to connect video cameras and other security tools to provide an ever-vigilant view of the secured environment.</p>



<p class="wp-block-paragraph">Companies such as Artificial Intelligence Technologies Solutions and its subsidiary Robotic Assistance Devices are connecting several devices for a sort of security mesh across a campus or building. The companies’ Speaking Autonomous Responsive Agent (SARA) is an agentic AI platform designed to coordinate cameras, fixed security devices, autonomous patrol vehicles, lights, speakers, monitoring systems, and human security personnel.</p>



<p class="wp-block-paragraph">SARA can evaluate events from physical security systems, verify security events, communicate directly with people at the site, and initiate approved responses, the companies say. The automated response can save valuable time compared to human intervention, they claim.</p>



<p class="wp-block-paragraph">Another example of the use of physical AI for security involves smart metal detectors with AI embedded inside. Athena Security is one company that offers AI-powered body scanners that claim a high rate of detection for all kinds of weapons, including razor blades and small knives.</p>



<h3 class="wp-block-heading">Smart buildings and infrastructure</h3>



<p class="wp-block-paragraph">Companies can use physical AI to monitor all kinds of metrics inside buildings and across utility grids and telecom networks, notes UST’s Masood. The AI can trigger alerts, safety interventions, or environmental controls. Hospitals are now using physical AI to coordinate care, and network operators are deploying AI-powered self-healing tools.</p>



<p class="wp-block-paragraph">Physical AI will create intelligent concierges at hotels, airports, and hospitals that provide directions, verify identities, and coordinate services, Kneron’s Liu says.</p>



<p class="wp-block-paragraph">Over the next decade, AI will be embedded in nearly all physical spaces, including drive-thru lanes, restaurants, factories, and offices, he predicts. “People will expect a security camera that understands intent instead of simply detecting motion, a hospital room that recognizes subtle changes in a patient’s condition before an alarm sounds, a retail shelf that manages inventory autonomously, or a building that continuously optimizes energy, security, and occupancy,” he adds.</p>



<h3 class="wp-block-heading">Smart cities</h3>



<p class="wp-block-paragraph">Outside of traditional enterprise environments, cities are now embedding AI into traffic devices to monitor vehicle flow and into cameras to monitor community service needs.</p>



<p class="wp-block-paragraph">The AI-powered systems can improve traffic flow, monitor intersections, and make roadways safer without relying only on human observation. Lidar maker Ouster worked with the New Jersey Department of Transportation to install sensors at 42 intersections ahead of the World Cup tournament to assist with road and pedestrian traffic congestion, the company says.</p>



<p class="wp-block-paragraph">NTT DATA is working with Brownville, Texas, to set up a citywide alert system to send workers for incidents such as when a park’s garbage containers are full and to assist police officers in filling out reports, notes Sandhu.</p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[7 use cases for leveraging AI in the physical world]]></title>
<description><![CDATA[The next big AI wave won’t be a chatbot in your laptop, or an agent that works behind the scenes to turn meeting notes into project tickets, but AI that takes control of devices that move and interact with the environment.



Physical AI can be defined as the integration of AI into autonomous sys...]]></description>
<link>https://tsecurity.de/de/3707629/it-nachrichten/7-use-cases-for-leveraging-ai-in-the-physical-world/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3707629/it-nachrichten/7-use-cases-for-leveraging-ai-in-the-physical-world/</guid>
<pubDate>Thu, 06 Aug 2026 12:50:21 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>



<p class="wp-block-paragraph">The next big AI wave won’t be a chatbot in your laptop, or an <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">agent that works behind the scenes</a> to turn meeting notes into project tickets, but AI that takes control of devices that move and interact with the environment.</p>



<p class="wp-block-paragraph"><a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">Physical AI can be defined</a> as the integration of AI into autonomous systems, allowing them to perceive the environment around them and perform complex actions in the physical world. The <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">physical AI</a> market, currently valued at about $92 billion, is <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">projected by PwC</a> to surpass $489 billion by 2030.</p>



<p class="wp-block-paragraph">For many people, physical AI may conjure images of robots building widgets on a factory floor, or a self-driving car. Both examples are among the top use cases for physical AI, but physical AI is also being integrated into security cameras, traffic lights, inspection robots, medical devices, and more.</p>



<h2 class="wp-block-heading">What makes a strong use case for physical AI</h2>



<p class="wp-block-paragraph">IT leaders thinking about how to use physical AI should think beyond the <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">human-shaped robots</a> that generate a lot of attention, says <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">Adnan Masood</a>, chief AI architect at digital transformation provider UST.</p>



<p class="wp-block-paragraph">“I usually have one caution for CIOs — skip the humanoid theater,” he says. “The near-term advantage is adaptive automation in variable environments where conditions change, humans share the space, and downtime is expensive.”</p>



<p class="wp-block-paragraph">The sweet spot for physical AI is when it can run safely and repeatedly and can be audited within existing safety and compliance regimes, he adds.</p>



<p class="wp-block-paragraph">For physical AI to make a big impact, a handful of conditions must exist, adds <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">Vikram Venkat</a>, investor in physical AI systems at Cota Capital.</p>



<p class="wp-block-paragraph">First, there should be a major labor component, such as existing or expected labor shortages or conditions that make the work dangerous for humans, he says. In addition, the environment should be relatively constrained, because physical AI platforms generally aren’t yet proficient at handling highly variable environments.</p>



<p class="wp-block-paragraph">Finally, the task should be repeatable, often at high volumes, and have clear measurable outcomes, he adds.</p>



<p class="wp-block-paragraph">In the short term, a couple of other conditions should exist, Venkat says. First, deployments should be simple, and require minimal changes to existing processes, additional infrastructure, or integrations into existing systems. Second, humans in the loop should be able to correct errors.</p>



<h2 class="wp-block-heading">Top use cases for physical AI</h2>



<p class="wp-block-paragraph">Despite those constraints, physical AI’s potential is huge, says <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">Albert Liu</a>, founder and CEO of edge AI solutions vendor Kneron.</p>



<p class="wp-block-paragraph">“Most people think physical AI begins with robots, which is simply the example our minds go to since it has been the most visible until now,” he notes. “But physical AI isn’t just about the typical answer — machines that move — it’s about environments that become intelligent.”</p>



<p class="wp-block-paragraph">With several caveats in mind, here are seven promising uses for physical AI systems.</p>



<h3 class="wp-block-heading">Manufacturing robots</h3>



<p class="wp-block-paragraph">When thinking about physical AI, many people may envision robots manufacturing cars or other products. That’s certainly happening, with several vendors offering builder robots for sale, and with the industrial robotics market valued at $54.3 billion in 2026, growing to $94.4 billion by 2031, <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">according to Mordor Intelligence</a>.</p>



<p class="wp-block-paragraph">One example of robots building products comes from car maker <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">BMW, which has used a humanoid robot</a> to weld parts together at a plant in the US.</p>



<h3 class="wp-block-heading">Quality inspection and predictive maintenance</h3>



<p class="wp-block-paragraph">Physical AI deployed inside manufacturing environments isn’t just being used to assemble products. The technology is also being used for material handling and automated quality inspection and defect checking, with labor shortages and constrained environments driving use, notes Venkat.</p>



<p class="wp-block-paragraph"><a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">Predictive maintenance</a> is also a sweet spot for physical AI in manufacturing. AI can be used to check that the software powering equipment is working correctly, says UST’s Masood.</p>



<p class="wp-block-paragraph">“Agentic pipelines now read hardware schematics and chip pinouts natively, generate the regression suites engineers once scripted by hand, and compare live equipment telemetry against digital twins to catch firmware regressions and signal-integrity faults before a production run,” he says.</p>



<p class="wp-block-paragraph">Boston Dynamics’ four-legged Spot is an example of a marriage between robotics and AI, with the company saying thousands of robots have been deployed across 40 countries at companies such as Intel, Chevron, Michelin, <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">and Cargill</a>. Spot is used to automate industrial inspections, conduct predictive maintenance, and go on security patrols.</p>



<p class="wp-block-paragraph">Boston Dynamics also sells Stretch, which automates the unloading of trailers and containers, and Atlas, a humanoid robot that can lift, sort, and assemble products.</p>



<p class="wp-block-paragraph">Physical AI embedded into cameras and sensors can provide quality control inspections on factory floors, notes <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">Parm Sandhu</a>, group vice president for enterprise AI, edge computing, and digital innovation at IT solutions provider NTT DATA.</p>



<p class="wp-block-paragraph">“They want to make sure the products built right the first time,” he says. “We use a foundation model, set up with cameras and trained in self-learning, so it very can very quickly learn standard operating procedure for one factory station.”</p>



<h3 class="wp-block-heading">Autonomous vehicles and drones</h3>



<p class="wp-block-paragraph">The promise of self-driving cars entered the public consciousness several years ago, and the market, separate from the physical AI market, was worth more than <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">$200 billion in 2025</a>, according to Global Market Insights.</p>



<p class="wp-block-paragraph">Autonomous taxis are also gaining momentum, with Waymo and Tesla <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">launching robotaxi experiments</a> in limited areas in 2025. Uber also has huge plans for robotaxis.</p>



<p class="wp-block-paragraph">But the autonomous vehicle market extends far beyond cars driving down the highway. Autonomous farm equipment, including <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">tractors, harvesters, and drones</a>, represent a growing market, with market size estimates varying wildly. Global Market Insights <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">estimated the market</a> to be worth $70.9 billion in 2025, with projections for it to reach $144.7 billion by 2035.</p>



<p class="wp-block-paragraph">Drones can also be operated by an AI, leading to all kinds of applications, including military uses and food and package delivery services. Amazon and other companies have experimented with drone delivery services in recent years, and DoorDash announced in late July that it <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">would jump into the market</a>.</p>



<p class="wp-block-paragraph">One use that staddles the autonomous vehicle and manufacturing use cases involves self-driving forklifts. NTT DATA has worked with forklift manufacturer Hyster-Yale to install self-driving capabilities into the vehicles, in part a response to labor shortages, Sandhu says.</p>



<p class="wp-block-paragraph">“If you think about manufacturing, pretty much everything you touch in that world was lifted by a forklift somewhere or components were lifted by a forklift somewhere,” he says. “But people don’t want to drive forklifts, and that’s a huge problem.”</p>



<h3 class="wp-block-heading">Fleet and warehouse coordination</h3>



<p class="wp-block-paragraph">Physical AI, built into trucks and smart shelves, can track and better coordinate the movement of materials and products, from the warehouse to the end customer. Physical AI, installed in robots, <a href="https://tsecurity.de/weiterlesen/3679483/3707629/7-use-cases-for-leveraging-ai-in-the-physical-world/" target="_blank" rel="noopener noreferrer">can pick, sort, and transport</a> goods. AI can use fleet telemetry to optimize routes in the shipping fleet.</p>



<p class="wp-block-paragraph">AI models can now orchestrate thousands of autonomous mobile robots across fulfillment networks, what UST’s Masood calls “air traffic control for robots.”</p>



<p class="wp-block-paragraph">The AI intelligence sits in the coordination layer that routes, sequences, and removes conflicts in the fleet, he adds. “It scales in ways single-robot programming never could,” notes.</p>



<p class="wp-block-paragraph">Physical AI has moved beyond pilots and is operating at enterprise scale in warehouses, according to Symbotic, a warehouse physical AI vendor.</p>



<p class="wp-block-paragraph">The company’s fleet of 22,000 autonomous mobile robots that traveled more than 200 million miles in 2025, with one robot traveling more than 52,000 miles, or more than twice the distance around the Earth, the company says.</p>



<h3 class="wp-block-heading">Surveillance and physical security</h3>



<p class="wp-block-paragraph">Physical AI’s application to physical security includes roving robots like Boston Dynamics’ Spot, but it also allows organizations to connect video cameras and other security tools to provide an ever-vigilant view of the secured environment.</p>



<p class="wp-block-paragraph">Companies such as Artificial Intelligence Technologies Solutions and its subsidiary Robotic Assistance Devices are connecting several devices for a sort of security mesh across a campus or building. The companies’ Speaking Autonomous Responsive Agent (SARA) is an agentic AI platform designed to coordinate cameras, fixed security devices, autonomous patrol vehicles, lights, speakers, monitoring systems, and human security personnel.</p>



<p class="wp-block-paragraph">SARA can evaluate events from physical security systems, verify security events, communicate directly with people at the site, and initiate approved responses, the companies say. The automated response can save valuable time compared to human intervention, they claim.</p>



<p class="wp-block-paragraph">Another example of the use of physical AI for security involves smart metal detectors with AI embedded inside. Athena Security is one company that offers AI-powered body scanners that claim a high rate of detection for all kinds of weapons, including razor blades and small knives.</p>



<h3 class="wp-block-heading">Smart buildings and infrastructure</h3>



<p class="wp-block-paragraph">Companies can use physical AI to monitor all kinds of metrics inside buildings and across utility grids and telecom networks, notes UST’s Masood. The AI can trigger alerts, safety interventions, or environmental controls. Hospitals are now using physical AI to coordinate care, and network operators are deploying AI-powered self-healing tools.</p>



<p class="wp-block-paragraph">Physical AI will create intelligent concierges at hotels, airports, and hospitals that provide directions, verify identities, and coordinate services, Kneron’s Liu says.</p>



<p class="wp-block-paragraph">Over the next decade, AI will be embedded in nearly all physical spaces, including drive-thru lanes, restaurants, factories, and offices, he predicts. “People will expect a security camera that understands intent instead of simply detecting motion, a hospital room that recognizes subtle changes in a patient’s condition before an alarm sounds, a retail shelf that manages inventory autonomously, or a building that continuously optimizes energy, security, and occupancy,” he adds.</p>



<h3 class="wp-block-heading">Smart cities</h3>



<p class="wp-block-paragraph">Outside of traditional enterprise environments, cities are now embedding AI into traffic devices to monitor vehicle flow and into cameras to monitor community service needs.</p>



<p class="wp-block-paragraph">The AI-powered systems can improve traffic flow, monitor intersections, and make roadways safer without relying only on human observation. Lidar maker Ouster worked with the New Jersey Department of Transportation to install sensors at 42 intersections ahead of the World Cup tournament to assist with road and pedestrian traffic congestion, the company says.</p>



<p class="wp-block-paragraph">NTT DATA is working with Brownville, Texas, to set up a citywide alert system to send workers for incidents such as when a park’s garbage containers are full and to assist police officers in filling out reports, notes Sandhu.</p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Lawmaker Who Wants Data Center Pause Wins Kansas Democratic Primary]]></title>
<description><![CDATA[Kansas Democrats nominated State Senator Cindy Holscher for governor after she defeated party-backed rival Ethan Corson. "The race became a test of what sort of candidate Democratic voters prefer in what is expected to be a challenging general election race: a more moderate candidate like Mr. Cor...]]></description>
<link>https://tsecurity.de/de/3706744/it-security-nachrichten/lawmaker-who-wants-data-center-pause-wins-kansas-democratic-primary/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3706744/it-security-nachrichten/lawmaker-who-wants-data-center-pause-wins-kansas-democratic-primary/</guid>
<pubDate>Wed, 05 Aug 2026 23:17:01 +0200</pubDate>
<content:encoded><![CDATA[Kansas Democrats nominated State Senator Cindy Holscher for governor after she defeated party-backed rival Ethan Corson. "The race became a test of what sort of candidate Democratic voters prefer in what is expected to be a challenging general election race: a more moderate candidate like Mr. Corson with endorsements from party leaders or an outspoken populist like Ms. Holscher, who spoke out against data centers and the political establishment," reports The New York Times. From the repot: Even in a national political environment that could favor Democrats, Republicans see the Kansas governorship as among their best opportunities for flipping a seat. President Trump carried Kansas by 16 percentage points in 2024, and Republicans hold supermajorities in the State Legislature. Voters in the Republican primary for governor nominated Ty Masterson, the president of the Kansas Senate and the recipient of Mr. Trump's endorsement, according to The A.P.
 
Ms. Holscher, who is from suburban Kansas City, sought out a lane to Mr. Corson's political left and made inroads with some of the state's progressive voters. She emphasized her role in unwinding former Gov. Sam Brownback's tax policies and called for a moratorium on data centers. She also spoke against a final deal to lure the Kansas City Chiefs across the state line from Missouri. Ms. Holscher presented an implicit critique of Ms. Kelly's stewardship of Kansas, referring to Mr. Corson as part of a political establishment that was too cozy with corporations and out of touch with the party's voters. "I'm the only Democrat in this race to call for a moratorium on data centers because we have to get these guardrails in place," said Holscher in an interview. "We are having our people and our resources exploited."<p></p><div class="share_submission">
<a href="https://tsecurity.de/weiterlesen/3678600/3706744/lawmaker-who-wants-data-center-pause-wins-kansas-democratic-primary/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
<a href="https://tsecurity.de/weiterlesen/3678600/3706744/lawmaker-who-wants-data-center-pause-wins-kansas-democratic-primary/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>



</div><p><a href="https://tsecurity.de/weiterlesen/3678600/3706744/lawmaker-who-wants-data-center-pause-wins-kansas-democratic-primary/" target="_blank" rel="noopener noreferrer">Read more of this story</a> at Slashdot.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Small, Siri, and smart: What to expect from HomePod mini 2]]></title>
<description><![CDATA[Apple is preparing some smart home updates, with a new HomePod mini expected soon. Here's what to expect from Apple's small wireless speaker.HomePod mini 2 shouldn't change much from the first-gen's external appearance. Apple's HomePod mini is a key part of the smart home. While it is obviously a...]]></description>
<link>https://tsecurity.de/de/3706501/apple-ios-macos/small-siri-and-smart-what-to-expect-from-homepod-mini-2/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3706501/apple-ios-macos/small-siri-and-smart-what-to-expect-from-homepod-mini-2/</guid>
<pubDate>Wed, 05 Aug 2026 19:43:35 +0200</pubDate>
<content:encoded><![CDATA[Apple is preparing some smart home updates, with a new <a href="https://tsecurity.de/weiterlesen/3678358/3706501/small-siri-and-smart-what-to-expect-from-homepod-mini-2/" target="_blank" rel="noopener noreferrer">HomePod mini</a> expected soon. Here's what to expect from Apple's small wireless speaker.<br><br><div><img src="https://media.appleinsider.com/gallery/68475-144269-HomePod-mini-desk-xl.jpg" alt="White spherical smart speaker glowing on top, placed on a desk beside a closed laptop and a smartphone in a brown case"><br><span>HomePod mini 2 shouldn't change much from the first-gen's external appearance. </span></div><br>Apple's HomePod mini is a key part of the smart home. While it is obviously a great and compact speaker and a way to communicate with <a href="https://tsecurity.de/weiterlesen/3678358/3706501/small-siri-and-smart-what-to-expect-from-homepod-mini-2/" target="_blank" rel="noopener noreferrer">Siri</a> without using your <a href="https://tsecurity.de/weiterlesen/3678358/3706501/small-siri-and-smart-what-to-expect-from-homepod-mini-2/" target="_blank" rel="noopener noreferrer">iPhone</a>, it's also a hub to manage all of your smart home devices using <a href="https://tsecurity.de/weiterlesen/3678358/3706501/small-siri-and-smart-what-to-expect-from-homepod-mini-2/" target="_blank" rel="noopener noreferrer">Apple Home</a>.<br><br>However, since its release in 2020, the HomePod mini hasn't had much in the way of updates, save for some new colors. A glow-up is long overdue.<br><br><br> <a href="https://tsecurity.de/weiterlesen/3678358/3706501/small-siri-and-smart-what-to-expect-from-homepod-mini-2/" target="_blank" rel="noopener noreferrer">Continue Reading on AppleInsider</a> | <a href="https://tsecurity.de/weiterlesen/3678358/3706501/small-siri-and-smart-what-to-expect-from-homepod-mini-2/" target="_blank" rel="noopener noreferrer">Discuss on our Forums</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[Brown Health Medical Group-MA Data Breach Exposes Information of 311,000 Individuals]]></title>
<description><![CDATA[Brown Health Medical Group-MA breach exposed personal, medical, and financial data of over 311,000 individuals after hackers accessed its servers. Brown Health Medical Group-MA data breach exposed personal, medical, and financial data of over 311,000 individuals after hackers accessed its servers...]]></description>
<link>https://tsecurity.de/de/3706453/hacking-pentesting/brown-health-medical-group-ma-data-breach-exposes-information-of-311000-individuals/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3706453/hacking-pentesting/brown-health-medical-group-ma-data-breach-exposes-information-of-311000-individuals/</guid>
<pubDate>Wed, 05 Aug 2026 19:38:10 +0200</pubDate>
<content:encoded><![CDATA[Brown Health Medical Group-MA breach exposed personal, medical, and financial data of over 311,000 individuals after hackers accessed its servers. Brown Health Medical Group-MA data breach exposed personal, medical, and financial data of over 311,000 individuals after hackers accessed its servers. The healthcare group identified a data security breach involving a legacy file server on […]]]></content:encoded>
</item>
<item>
<title><![CDATA[Brown Health Medical Group-MA Data Breach Exposes Information of 311,000 Individuals]]></title>
<description><![CDATA[Brown Health Medical Group-MA breach exposed personal, medical, and financial data of over 311,000 individuals after hackers accessed its servers. Brown Health Medical Group-MA data breach exposed personal, medical, and financial data of over 311,000 individuals after hackers accessed its servers...]]></description>
<link>https://tsecurity.de/de/3706431/it-security-nachrichten/brown-health-medical-group-ma-data-breach-exposes-information-of-311000-individuals/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3706431/it-security-nachrichten/brown-health-medical-group-ma-data-breach-exposes-information-of-311000-individuals/</guid>
<pubDate>Wed, 05 Aug 2026 19:33:45 +0200</pubDate>
<content:encoded><![CDATA[Brown Health Medical Group-MA breach exposed personal, medical, and financial data of over 311,000 individuals after hackers accessed its servers. Brown Health Medical Group-MA data breach exposed personal, medical, and financial data of over 311,000 individuals after hackers accessed its servers. The healthcare group identified a data security breach involving a legacy file server on […]]]></content:encoded>
</item>
<item>
<title><![CDATA[Thou Shall Not 'ls -la']]></title>
<description><![CDATA[submit to towards data science ## 1. The Incident

It's 2:47 PM on a Tuesday. Somewhere on your team, a junior engineer wants to know how much disk space last quarter's render output is taking up. They SSH into the NAS, cd into the shared mount, and type the four most dangerous characters in a st...]]></description>
<link>https://tsecurity.de/de/3706208/sichere-programmierung/thou-shall-not-ls-la/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3706208/sichere-programmierung/thou-shall-not-ls-la/</guid>
<pubDate>Wed, 05 Aug 2026 17:14:02 +0200</pubDate>
<content:encoded><![CDATA[<p>submit to towards data science ## 1. The Incident</p>

<p>It's 2:47 PM on a Tuesday. Somewhere on your team, a junior engineer wants to know how much disk space last quarter's render output is taking up. They SSH into the NAS, <code>cd</code> into the shared mount, and type the four most dangerous characters in a storage admin's vocabulary:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>find / <span class="nt">-mtime</span> +90
</code></pre>

</div>



<p>or maybe<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code><span class="nb">ls</span> <span class="nt">-laR</span>
</code></pre>

</div>



<p>Thirty seconds later, Slack lights up. Someone's editing session on the array just froze. The metadata server's CPU is pinned. IOPS that were supposed to be serving production reads are instead being burned walking a directory tree with 50 million entries. For the next twenty minutes, your team experiences what can only be described as a storage brownout — not because anyone did anything malicious, but because someone asked a question the file system was never built to answer quickly.</p>

<p>If "thou shalt not <code>ls -laR</code>" is an actual rule at your organization — written down, whispered as folklore, or learned the hard way — that's not a people problem. It's a sign your architecture has outgrown your file system. The fix isn't "train people not to run <code>find</code>." The fix is to stop using a file system as a database, because it was never designed to be one.</p>

<h2>
  
  
  2. The Problem with POSIX and File Systems
</h2>

<p>File systems like ext4, XFS, and NTFS trace their design lineage back to the 1970s. Their job, fundamentally, is to answer one question well: given a path, where are the bytes? They do this through inodes and directory trees — a hierarchical structure where every "ls" of a directory means opening it, reading its entries, and for anything richer than a name (size, mtime, permissions), stat-ing each one individually.</p>

<p>That design is excellent for what it was built for: reading and writing files. It is a terrible design for the question storage teams actually ask as they scale: <em>"which files haven't been touched in 90 days?"</em> or <em>"how much are we storing in `/projects/</em>/rushes`?"*</p>

<p>There's no index for that. There's no <code>WHERE</code> clause. To answer it, the OS has no choice but to traverse the entire tree, open every directory, and stat every inode along the way — an O(n) operation where n is your total file count. At a few thousand files, you don't notice. At 50 million files spread across a shared NFS mount, that traversal doesn't just take a while — it competes for the exact same metadata I/O that production workloads depend on, and it can bring a storage array to its knees.</p>

<p>The real issue isn't that recursive scans are slow. It's that as storage scales into hundreds of terabytes or petabytes, the actual payload data stops being the bottleneck. The <em>metadata</em> — the information about the data — becomes the thing you're constantly fighting.</p>

<h2>
  
  
  3. Enter the Data Catalog
</h2>

<p>A data catalog solves this by doing something conceptually simple: it decouples the <em>knowledge</em> of your data from the <em>physical storage</em> of your data. Instead of a directory tree you have to walk, you get a structured, indexed database — usually SQL or a fast key-value store — that already knows the answer before you ask.</p>

<p>The mechanics look like this:</p>

<ul>
<li>Rather than reading the disk to discover what files exist, applications and users query the catalog directly.</li>
<li>The catalog indexes the metadata you'd expect from POSIX — size, timestamps, permissions — but also stores extended context a file system has no concept of: checksums, version history, logical groupings, custom tags.</li>
<li>The catalog stays in sync with reality either through filesystem event listeners (think <code>inotify</code> / <code>fanotify</code>) or by updating itself at the moment data is ingested — so it reflects the true state of your storage without ever needing to re-scan it.</li>
</ul>

<p>The net effect: a question that used to mean "walk a 50-million-node tree" becomes "run an indexed query." Same question, radically different cost.</p>

<h2>
  
  
  4. Why Catalogs Are a Massive Improvement
</h2>

<p><strong>1. Query speed — milliseconds instead of hours.</strong> Finding every 50GB video file older than a year stops being a recursive filesystem crawl and becomes a <code>SELECT</code>. It runs in milliseconds and generates <em>zero</em> I/O against your actual storage array.</p>

<p><strong>2. Abstraction of physical location.</strong> A file system assumes your file's bytes live at a specific block on a specific disk, full stop. A catalog doesn't have to make that assumption. It can record that a file logically exists while its physical bytes are sitting in an S3 bucket, on a cold SMR drive, or offline on an LTO tape sitting on a shelf — and the catalog is the only thing that needs to know which.</p>

<p><strong>3. Rich, enforceable policy.</strong> You can't attach a business rule to an inode. You <em>can</em> attach <code>compliance_retention = 7_years</code> or <code>tiering_policy = aggressive</code> to a row in a catalog, and then let a policy engine act on that column instead of parsing filenames or crawling directories to guess at intent.</p>

<p>Here's the contrast that makes it click. The bash version of "what's old":<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>find /mnt/storage <span class="nt">-mtime</span> +90 <span class="nt">-type</span> f
</code></pre>

</div>



<p>...which has to touch every inode under the search path. The catalog version of the same question:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight sql"><code><span class="k">SELECT</span> <span class="n">file_path</span>
<span class="k">FROM</span> <span class="k">catalog</span>
<span class="k">WHERE</span> <span class="n">last_accessed</span> <span class="o">&lt;</span> <span class="nb">date</span><span class="p">(</span><span class="s1">'now'</span><span class="p">,</span> <span class="s1">'-90 days'</span><span class="p">);</span>
</code></pre>

</div>



<p>...which touches an index, not your disks.</p>

<h2>
  
  
  5. Bringing It Home: The HuskHoard Catalog &amp; Tiering Engine
</h2>

<p>Full-blown enterprise data catalogs exist — Collibra, Alation, and friends — but they're built for data lakes and databases, priced accordingly, and overkill if what you actually want is to stop your NVMe array from filling up with cold files nobody's touched since 2023.</p>

<p>This is the gap <a href="https://tsecurity.de/weiterlesen/3678065/3706208/thou-shall-not-ls-la/" target="_blank" rel="noopener noreferrer">HuskHoard</a> is built for: an open-source, AGPL-licensed, Rust-based tiering engine for Linux that treats the catalog — not the file system — as the ground source of truth for where your data actually lives.</p>

<p><strong>The catalog is a SQLite brain, not a directory walk.</strong> HuskHoard keeps a <code>husk_catalog.db</code> file that tracks, per archived object, the exact physical volume UUID and byte offset it lives at, its version history, its BLAKE3 checksum, and its original POSIX metadata. When the system needs to know where a file's bytes are, it queries this database — it never has to scan a tape, a disk, or a cloud bucket to find out.</p>

<p><strong>Files stay visible without occupying space.</strong> HuskHoard doesn't use FUSE. It hooks into the Linux <code>fanotify</code> kernel API to watch for file access in real time. When cold data is archived, the file on your hot tier shrinks to occupy effectively zero disk blocks while its logical size — the size <code>ls</code> reports — stays exactly the same. The moment an application actually opens that file, the Interceptor blocks the read for a moment, pulls the real bytes back from wherever the catalog says they are, and resumes the process like nothing happened.</p>

<p><strong>The Janitor queries SQL, not your NVMe drives.</strong> The policy engine that decides what's cold enough to archive runs against the catalog's indexes — by age, extension, or directory rule — instead of stat-ing your way through a live filesystem tree. When it finds a candidate, the Archive Worker compresses it into independent Zstd frames, writes it out to whichever tier you've configured (a flat disk image, a physical LTO-5 through LTO-9 tape drive, or a cloud bucket via <code>rclone</code>), and updates the catalog's offset columns. Nothing about that process ever requires a recursive scan of your storage.</p>

<p><strong>Why "Zstd frame format" matters more than it sounds like it should.</strong> Compression algorithms normally chain their dictionary state across an entire file, which means seeking into the middle of a compressed archive forces you to decompress everything before it just to rebuild that state. For a 200GB dataset on tape, that's not a rounding error — it's the difference between an instant partial read and stalling a pipeline for an hour. HuskHoard breaks that chain deliberately: files are sliced into independent 16MB frames, with the dictionary reset at every boundary, and a small TLV (type-length-value) index embedded directly in the file's own header maps uncompressed offsets to their compressed position on the volume. A request for a specific byte range binary-searches that index, seeks straight to the right frame, and decompresses only the ~16MB it actually needs — whether the data is sitting on disk, in the cloud, or on a physical tape cartridge. Pre-compressed formats like MP4 skip the compression path entirely and get true O(1) seeks, because logical and physical offsets line up 1-to-1.</p>

<p>The result is a system where the catalog answers "where is it" instantly, and the frame format answers "how do I get just the part I need" without ever reading the whole object.</p>

<h2>
  
  
  6. Conclusion
</h2>

<p>File systems are excellent at one job: holding bytes reliably on a disk. They are not, and were never meant to be, databases — and the moment you start asking them database questions at scale, you find that out the hard way, usually during business hours, usually while someone's editing session freezes.</p>

<p>If you want to manage data efficiently, cut your electricity bill, and automate tiering without putting your array through a brownout every time someone wants a list of old files, the fix is architectural: decouple the <em>knowledge</em> of your data from the <em>storage</em> of your data.</p>

<p>So the next time someone reaches for <code>find / -mtime +90</code> across a shared mount with tens of millions of files, stop them — and point them at a catalog instead.</p>

<ul>
<li>HuskHoard on GitHub: <a href="https://tsecurity.de/weiterlesen/3678065/3706208/thou-shall-not-ls-la/" target="_blank" rel="noopener noreferrer">github.com/huskhoard/huskhoard</a>
</li>
<li>Project site: <a href="https://tsecurity.de/weiterlesen/3678065/3706208/thou-shall-not-ls-la/" target="_blank" rel="noopener noreferrer">huskhoard.com</a>
</li>
<li>Architecture deep dives: <a href="https://tsecurity.de/weiterlesen/3678065/3706208/thou-shall-not-ls-la/" target="_blank" rel="noopener noreferrer">huskhoard.com/blog.html</a> — particularly the posts on <a href="https://tsecurity.de/weiterlesen/3678065/3706208/thou-shall-not-ls-la/" target="_blank" rel="noopener noreferrer">the catalog as ground truth</a> and <a href="https://tsecurity.de/weiterlesen/3678065/3706208/thou-shall-not-ls-la/" target="_blank" rel="noopener noreferrer">Jump Frames &amp; TLV headers</a>
</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[311,000 Impacted by Brown Health Medical Group-MA Data Breach]]></title>
<description><![CDATA[Hackers stole personal information, medical records, and financial information from the organization’s server.
The post 311,000 Impacted by Brown Health Medical Group-MA Data Breach appeared first on SecurityWeek.]]></description>
<link>https://tsecurity.de/de/3705643/it-security-nachrichten/311000-impacted-by-brown-health-medical-group-ma-data-breach/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3705643/it-security-nachrichten/311000-impacted-by-brown-health-medical-group-ma-data-breach/</guid>
<pubDate>Wed, 05 Aug 2026 13:49:10 +0200</pubDate>
<content:encoded><![CDATA[<p>Hackers stole personal information, medical records, and financial information from the organization’s server.</p>
<p>The post <a href="https://tsecurity.de/weiterlesen/3677500/3705643/311000-impacted-by-brown-health-medical-group-ma-data-breach/" target="_blank" rel="noopener noreferrer">311,000 Impacted by Brown Health Medical Group-MA Data Breach</a> appeared first on <a href="https://tsecurity.de/weiterlesen/3677500/3705643/311000-impacted-by-brown-health-medical-group-ma-data-breach/" target="_blank" rel="noopener noreferrer">SecurityWeek</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Ramen After Dark — A Steaming Comfort-Food Scene Drawn Entirely in CSS]]></title>
<description><![CDATA[This is a submission for Frontend Challenge — Comfort Food Edition, CSS Art.


  
  
  Inspiration


My comfort-food moment is not only the ramen itself. It is the scene around it: a nearly empty counter, the city gone quiet, steam rising into warm light, and a paper-like moon outside the window....]]></description>
<link>https://tsecurity.de/de/3704960/sichere-programmierung/ramen-after-dark-a-steaming-comfort-food-scene-drawn-entirely-in-css/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3704960/sichere-programmierung/ramen-after-dark-a-steaming-comfort-food-scene-drawn-entirely-in-css/</guid>
<pubDate>Wed, 05 Aug 2026 08:02:20 +0200</pubDate>
<content:encoded><![CDATA[<p><em>This is a submission for <a href="https://tsecurity.de/weiterlesen/3676817/3704960/ramen-after-dark-a-steaming-comfort-food-scene-drawn-entirely-in-css/" target="_blank" rel="noopener noreferrer">Frontend Challenge — Comfort Food Edition, CSS Art</a>.</em></p>

<h2>
  
  
  Inspiration
</h2>

<p>My comfort-food moment is not only the ramen itself. It is the scene around it: a nearly empty counter, the city gone quiet, steam rising into warm light, and a paper-like moon outside the window.</p>

<p>I created <strong>Ramen After Dark</strong> to capture that pause at the end of the day. The palette uses deep brown-red night tones, warm ceramic, amber broth, and a soft gold moon so the bowl feels like the brightest and safest place in the frame.</p>

<h2>
  
  
  Demo
</h2>

<ul>
<li><a href="https://tsecurity.de/weiterlesen/3676817/3704960/ramen-after-dark-a-steaming-comfort-food-scene-drawn-entirely-in-css/" target="_blank" rel="noopener noreferrer">Open the full CSS artwork</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3676817/3704960/ramen-after-dark-a-steaming-comfort-food-scene-drawn-entirely-in-css/" target="_blank" rel="noopener noreferrer">View the HTML and CSS on GitHub</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3676817/3704960/ramen-after-dark-a-steaming-comfort-food-scene-drawn-entirely-in-css/" target="_blank" rel="noopener noreferrer">Explore the related Midnight Broth landing page</a></li>
</ul>


<div class="crayons-card c-embed text-styles text-styles--secondary">
    <div class="c-embed__content">
      <div class="c-embed__body flex items-center justify-between">
        <a href="https://tsecurity.de/weiterlesen/3676817/3704960/ramen-after-dark-a-steaming-comfort-food-scene-drawn-entirely-in-css/" target="_blank" rel="noopener noreferrer">
          <span class="mr-2">takahiro-saeki.github.io</span>
          

        </a>
      </div>
    </div>
</div>


<h2>
  
  
  Journey
</h2>

<h3>
  
  
  Constructing the bowl from basic shapes
</h3>

<p>The artwork contains no images, SVG illustration paths, canvas, or JavaScript. The large bowl begins as a rounded rectangle with a thick ceramic border. A second oval creates the broth surface and clips all of the toppings.</p>

<p>Each ingredient is another small CSS shape:</p>

<ul>
<li>The egg is an irregular rounded rectangle with an inset yolk.</li>
<li>Nori uses dark rectangles with crossing gradients for texture.</li>
<li>Chashu uses rounded shapes and radial gradients.</li>
<li>Noodles are border arcs layered across the broth.</li>
<li>Scallions are tiny bordered ellipses.</li>
<li>Naruto uses a pale rounded shape with a partial pink ring.</li>
<li>Chopsticks are two long gradients rotated across the scene.</li>
</ul>

<p>The city silhouette is a row of simple blocks. The moon uses nested circles and radial gradients. Even the ceramic pattern is made from three square borders rotated by 45 degrees.</p>

<h3>
  
  
  Creating depth without a drawing API
</h3>

<p>The main challenge was preserving the order of overlapping elements. Nori needs to sit behind the noodles, the egg and pork need to remain readable inside a shallow broth ellipse, and the chopsticks must cross both the toppings and bowl rim.</p>

<p>I used isolated stacking contexts and a deliberately small z-index scale. Shadows beneath the bowl and highlights inside the broth create depth without changing the underlying geometry.</p>

<h3>
  
  
  Letting only the steam move
</h3>

<p>Three steam trails are the only animated elements. They use slow opacity, vertical translation, and horizontal scale changes. Their negative delays keep them from moving in sync.</p>

<p>The rest of the illustration remains still so the motion supports the subject instead of distracting from it. When the visitor prefers reduced motion, the shared stylesheet effectively disables the animation.</p>

<h3>
  
  
  Making one composition work across screen sizes
</h3>

<p>The artwork uses a 16:10 stage on larger screens and a taller 4:5 stage on mobile. The bowl, toppings, chopsticks, steam, and moon use percentages or clamped sizes, allowing the composition to reframe instead of simply shrinking.</p>

<p>I tested it at 375 and 1440 pixels and verified that the art frame stays within the viewport without horizontal scrolling.</p>

<h2>
  
  
  What I Am Proud Of
</h2>

<p>The bowl remains recognizable from the full composition down to mobile size, even though every ingredient is an ordinary HTML element. I also like that the artwork became the visual foundation for a separate functional restaurant landing page rather than remaining an isolated experiment.</p>

<p>This challenge was a good reminder that CSS art is closely related to interface work: both rely on hierarchy, constraints, layering, responsive composition, and knowing when a detail is helping the whole.</p>

<p>The complete project is available under the MIT license.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Build an Edge Crop Advisory API with Telnyx AI Inference]]></title>
<description><![CDATA[I built this as the next step after the Edge URL Summarizer example. The URL summarizer showed a simple pattern: run an AI workflow at the edge, fetch external content when needed, summarize it, and keep useful state close to the request. This crop advisory example takes that same pattern into a ...]]></description>
<link>https://tsecurity.de/de/3704318/sichere-programmierung/build-an-edge-crop-advisory-api-with-telnyx-ai-inference/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3704318/sichere-programmierung/build-an-edge-crop-advisory-api-with-telnyx-ai-inference/</guid>
<pubDate>Tue, 04 Aug 2026 23:02:35 +0200</pubDate>
<content:encoded><![CDATA[<p>I built this as the next step after the Edge URL Summarizer example. The URL summarizer showed a simple pattern: run an AI workflow at the edge, fetch external content when needed, summarize it, and keep useful state close to the request. This crop advisory example takes that same pattern into a more real-world workflow.</p>

<p>Instead of only summarizing a page, the app accepts a farmer’s field note or an agriculture advisory URL, classifies the crop issue, returns structured JSON, stores the advisory in a Stateful Actor, tracks issue/severity stats, and flags critical cases for escalation.</p>

<p>So the goal is not “AI gives farming advice” in a vacuum. The goal is to show how an edge-hosted AI app can turn messy field input into something operational: triage, history, stats, and a clear handoff path when a human expert needs to step in.<br>
Code: <a href="https://tsecurity.de/weiterlesen/3676175/3704318/build-an-edge-crop-advisory-api-with-telnyx-ai-inference/" target="_blank" rel="noopener noreferrer">https://github.com/team-telnyx/telnyx-code-examples/tree/main/edge-agri-crop-advisory</a></p>
<h2>
  
  
  What it does
</h2>

<p>You send the app a crop issue description:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>curl <span class="nt">-X</span> POST https://edge-agri-crop-advisory-&lt;<span class="nb">id</span><span class="o">&gt;</span>.telnyxcompute.com/advisory <span class="se">\</span>
  <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
  <span class="nt">-d</span> <span class="s1">'{"description":"Tomato leaves have holes all over them. I can see green caterpillars on the underside of the leaves."}'</span>
</code></pre>

</div>



<p>It returns a structured advisory:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight json"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"adv-msf1zxyc-0"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"farmer_description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Tomato leaves have holes..."</span><span class="p">,</span><span class="w">
  </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"text"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"crop_type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"tomato"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"issue_type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"pest"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"severity"</span><span class="p">:</span><span class="w"> </span><span class="s2">"medium"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"confidence"</span><span class="p">:</span><span class="w"> </span><span class="mf">0.76</span><span class="p">,</span><span class="w">
  </span><span class="nl">"recommendation"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Inspect the underside of leaves and remove visible caterpillars. Consider an appropriate biological or labeled treatment if damage continues."</span><span class="p">,</span><span class="w">
  </span><span class="nl">"escalate"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
  </span><span class="nl">"generated_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-08-04T19:31:04Z"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>

</div>



<p>If the case is critical, it gets flagged:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight json"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"severity"</span><span class="p">:</span><span class="w"> </span><span class="s2">"critical"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"escalate"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
  </span><span class="nl">"escalated_to"</span><span class="p">:</span><span class="w"> </span><span class="s2">"agronomist-on-call"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>

</div>



<h2>
  
  
  Routes
</h2>

<p>The example includes:</p>

<ul>
<li>
<code>POST /advisory</code> - create an advisory</li>
<li>
<code>GET /advisories</code> - list recent advisories</li>
<li>
<code>GET /advisories/&lt;id&gt;</code> - get one advisory</li>
<li>
<code>GET /stats</code> - see issue/severity/escalation stats</li>
<li>
<code>GET /health/liveness</code> - liveness check</li>
<li>
<code>GET /health/readiness</code> - readiness check</li>
</ul>

<p><code>POST /advisory</code> accepts either:</p>

<ul>
<li><code>description</code></li>
<li><code>url</code></li>
</ul>

<p>If you pass a URL, the app fetches the page, strips HTML, and uses that text as input.</p>

<h2>
  
  
  The AI call
</h2>

<p>The app calls:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>POST /v2/ai/chat/completions
</code></pre>

</div>



<p>The current code path uses:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>zai-org/GLM-5.2
</code></pre>

</div>



<p>The prompt asks the model to return JSON only with:</p>

<ul>
<li><code>crop_type</code></li>
<li><code>issue_type</code></li>
<li><code>severity</code></li>
<li><code>confidence</code></li>
<li><code>recommendation</code></li>
</ul>

<p>Issue types are constrained to:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>disease | pest | nutrient | water | weather | unknown
</code></pre>

</div>



<p>Severity is constrained to:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>low | medium | high | critical
</code></pre>

</div>



<p>That structure makes the response easier to store, display, route, and review.</p>

<h2>
  
  
  The Stateful Actor part
</h2>

<p>The app uses a <code>CropAdvisory</code> Stateful Actor.</p>

<p>It stores:</p>

<ul>
<li>advisories by ID</li>
<li>total advisory count</li>
<li>counts by issue type</li>
<li>counts by severity</li>
<li>escalation count</li>
<li>recent crop types</li>
</ul>

<p>So after a few requests, you can inspect the accumulated stats:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>curl https://edge-agri-crop-advisory-&lt;<span class="nb">id</span><span class="o">&gt;</span>.telnyxcompute.com/stats
</code></pre>

</div>



<h2>
  
  
  Run it
</h2>

<p>Clone the repo:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>git clone https://github.com/team-telnyx/telnyx-code-examples.git
<span class="nb">cd </span>telnyx-code-examples/edge-agri-crop-advisory
</code></pre>

</div>



<p>Set your Telnyx API key:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>telnyx-edge auth api-key <span class="nb">set</span> &lt;YOUR_API_KEY&gt;
telnyx-edge secrets add TELNYX_API_KEY <span class="s2">"KEY0123..."</span>
</code></pre>

</div>



<p>Install and deploy:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>npm <span class="nb">install
</span>telnyx-edge ship
</code></pre>

</div>



<p>Health check:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>curl <span class="nt">-sS</span> <span class="nt">--retry</span> 30 <span class="nt">--retry-delay</span> 5 <span class="se">\</span>
  https://edge-agri-crop-advisory-&lt;<span class="nb">id</span><span class="o">&gt;</span>.telnyxcompute.com/health/liveness
</code></pre>

</div>



<p>Create an advisory:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>curl <span class="nt">-X</span> POST https://edge-agri-crop-advisory-&lt;<span class="nb">id</span><span class="o">&gt;</span>.telnyxcompute.com/advisory <span class="se">\</span>
  <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
  <span class="nt">-d</span> <span class="s1">'{"description":"My corn has yellow streaks on bottom leaves with dark brown spots. About 30% of plants affected."}'</span>
</code></pre>

</div>



<h2>
  
  
  Production notes
</h2>

<p>This is a triage example, not a replacement for an agronomist.</p>

<p>Before using this pattern in production, I would add:</p>

<ul>
<li>authentication</li>
<li>farmer/account identity</li>
<li>region and crop stage</li>
<li>photo input</li>
<li>weather data</li>
<li>human review for high and critical cases</li>
<li>localized treatment guidance</li>
<li>safety warnings</li>
<li>SMS or webhook escalation</li>
</ul>

<p>Still, the pattern is useful: edge function for intake, AI model for structured classification, Stateful Actor for advisory history and stats.</p>

<p>Resources:</p>

<ul>
<li>Code: <a href="https://tsecurity.de/weiterlesen/3676175/3704318/build-an-edge-crop-advisory-api-with-telnyx-ai-inference/" target="_blank" rel="noopener noreferrer">https://github.com/team-telnyx/telnyx-code-examples/tree/main/edge-agri-crop-advisory</a>
</li>
<li>Stateful Actors Quick Start: <a href="https://tsecurity.de/weiterlesen/3676175/3704318/build-an-edge-crop-advisory-api-with-telnyx-ai-inference/" target="_blank" rel="noopener noreferrer">https://developers.telnyx.com/docs/edge-compute/stateful-actors/quick-start</a>
</li>
<li>Telnyx AI Inference docs: <a href="https://tsecurity.de/weiterlesen/3676175/3704318/build-an-edge-crop-advisory-api-with-telnyx-ai-inference/" target="_blank" rel="noopener noreferrer">https://developers.telnyx.com/docs/inference</a>
</li>
<li>Chat Completions API: <a href="https://tsecurity.de/weiterlesen/3676175/3704318/build-an-edge-crop-advisory-api-with-telnyx-ai-inference/" target="_blank" rel="noopener noreferrer">https://developers.telnyx.com/api/inference/chat-completions</a>
</li>
<li>Telnyx AI skills and toolkits: <a href="https://tsecurity.de/weiterlesen/3676175/3704318/build-an-edge-crop-advisory-api-with-telnyx-ai-inference/" target="_blank" rel="noopener noreferrer">https://github.com/team-telnyx/ai</a>
</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[‘This Summer Will Be Different’ Release Date, Cast, Plot and Production Updates]]></title>
<description><![CDATA[Netflix has officially started production on This Summer Will Be Different, its upcoming romance series based on Carley Fortune’s bestselling novel. The first behind-the-scenes image shows lead stars Sophie Nélisse, Roby Attal, and Francesca Reale together on Prince Edward Island.



The 10-episo...]]></description>
<link>https://tsecurity.de/de/3704148/apple-ios-macos/this-summer-will-be-different-release-date-cast-plot-and-production-updates/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3704148/apple-ios-macos/this-summer-will-be-different-release-date-cast-plot-and-production-updates/</guid>
<pubDate>Tue, 04 Aug 2026 21:12:41 +0200</pubDate>
<content:encoded><![CDATA[Netflix has officially started production on This Summer Will Be Different, its upcoming romance series based on Carley Fortune’s bestselling novel. The first behind-the-scenes image shows lead stars Sophie Nélisse, Roby Attal, and Francesca Reale together on Prince Edward Island.



The 10-episode series will film in Toronto and across Prince Edward Island, bringing the novel’s beaches, red cliffs, coastal towns, and summer atmosphere to the screen. Netflix has not announced a release date, although filming beginning in August 2026 suggests the show will arrive sometime in 2027.




Streaming platform: Netflix



Genre: Romance and drama



Episode count: 10 episodes



Production status: Filming has started



Filming locations: Toronto and Prince Edward Island



Release date: Not announced



Based on: Carley Fortune’s 2024 novel



Creators: Dane Clark and Linsey Stewart




What is the Netflix series about?



This Summer Will Be Different follows Lucy, a young woman moving through her twenties while trying to understand her first serious love. The problem is that she has fallen for Felix, the younger brother of her best friend, Bridget.



Their attraction develops across several summers on Prince Edward Island. Lucy and Felix know their relationship could damage her friendship with Bridget, yet their feelings become harder to ignore whenever they return to the island.



Spoiler warning for the novel



The story begins when Lucy meets Felix during her first trip to Prince Edward Island. Their connection quickly becomes physical, but Lucy later discovers that he is Bridget’s brother.



Lucy and Felix agree to stay apart, although they repeatedly break that promise over the following years. The main timeline brings Lucy back to the island before Bridget’s wedding, forcing the pair to confront their history and decide whether their relationship has a future.



The Netflix version could change parts of the novel or expand supporting characters across its 10 episodes.



Full cast revealed



Sophie Nélisse will play Lucy, while Roby Attal stars as Felix and Francesca Reale plays Bridget. The wider cast includes Jordan Rodrigues as Miles Lam, Jude Wilson as Zach, Natalie Brown as Christine, James Tupper as Ken, Tom Barnett as Peter, and Celia Owen as Joy.



Karen Maine, Jasmin Mozaffari, and Fab Filippo will direct episodes. Fortune also serves as an executive producer alongside creators Dane Clark and Linsey Stewart, Jennifer Kawaja, and Elise Cousineau.



With production underway and the main cast now confirmed, Netflix’s next major summer romance is beginning to take shape. Do you plan to watch Lucy and Felix’s complicated love story when This Summer Will Be Different arrives? Let us know in the comments.]]></content:encoded>
</item>
<item>
<title><![CDATA[AI coding agents are blowing through budgets — Replit, Kilo Code, and Symbotic explain how they're managing it]]></title>
<description><![CDATA[At Kilo Code, engineers are reading or writing code themselves only about 1% of the time now, according to co-founder Emilie Schario — the rest is agents. That shift is forcing new questions onto dev teams: which systems are safe to hand over, who cleans up when models goof up, how to support mul...]]></description>
<link>https://tsecurity.de/de/3703986/it-nachrichten/ai-coding-agents-are-blowing-through-budgets-replit-kilo-code-and-symbotic-explain-how-theyre-managing-it/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3703986/it-nachrichten/ai-coding-agents-are-blowing-through-budgets-replit-kilo-code-and-symbotic-explain-how-theyre-managing-it/</guid>
<pubDate>Tue, 04 Aug 2026 19:32:13 +0200</pubDate>
<content:encoded><![CDATA[<p>At Kilo Code, engineers are reading or writing code themselves only about 1% of the time now, according to co-founder Emilie Schario — the rest is agents. That shift is forcing new questions onto dev teams: which systems are safe to hand over, who cleans up when models goof up, how to support multi-model architectures, and whether skyrocketing token bills mean real progress or just burned IT budget.</p><p>As far as tech leads from Replit, Kilo Code, and Symbotic are concerned, it’s a natural — and welcome — evolution as agentic AI becomes embedded into more and more enterprise workflows. </p><p>“Unless something's really broken or debugging, 99% of the time engineers are not reading or writing code anymore,” Emilie Schario, co-founder of Kilo Code, said at <a href="https://tsecurity.de/weiterlesen/3675843/3703986/ai-coding-agents-are-blowing-through-budgets-replit-kilo-code-and-symbotic-explain-how-theyre-managing-it/" target="_blank" rel="noopener noreferrer">VB Transform 2026</a>. </p><div></div><h2>AI good at greenfield, not so great at brownfield</h2><p>For Jared Go, distinguished engineer for AI and cloud at warehouse automation company Symbotic, the current moment is about directing the focus of AI. "These are my criteria," he said. "Let's look at it from the lens of security, elegance, clean, concise code, water tightness." That way, AI does most of the heavy lifting, and human code review isn't as critical.</p><p>Human involvement becomes necessary further down the line, Go noted, because agents don't make strong product decisions. “Greenfield [building brand new codebases] is so easy for agents. Brownfield [writing, updating, or maintaining existing code] we all know is where the actual challenge lies.” </p><p>Replit takes a bit of a different tack: While the company has "gone very agentic," they've been more conservative with AI coding, explained Amol Jain, head of product engineering. An agent reviews each pull request (PR) and assigns it a risk score; low-risk PRs are self-merged by their author, while others go to human reviewers who read the code and give feedback.</p><p>“The idea was human on the loop, not human in the loop,” Jain said. Replit’s internal tool is essentially self-driving for software engineers; devs give a task to agents, which do end to end planning, implementation, and testing. </p><p>“It's a fleet of agents that run in their own cloud virtual machines (VMs) with access controls behind token proxies so they're secure,” Jain said. </p><p>He shared one example where an engineer couldn’t repro or solve a “very gnarly bug” deep in its systems. It was sent to an AI manager agent, which told it to go to sleep. The manager agent then spun up a bunch of underlying agents that found the issue; it subsequently spun up a bunch more agents that found the fix. Six hours later, AI had a PR ready for the bug that had puzzled human engineers. </p><h2>Multi-model is the future </h2><p>AI providers are also evolving beyond the lock-in model, as customers increasingly demand multi-model choice. </p><p>Kilo Code, for its part, supports 500-plus models in its gateway. "Your software that you're using to do agentic engineering should be decoupled from the model that you're using to do it," Schario said.</p><p>For instance, Schario said companies often use expensive frontier-tier models to architect a project, then switch to a less expensive open-weight model for the rest of the work.</p><p>It’s also important to respect model provider limitations, such as when they need to work in closed or isolated environments or providers in their specific regions. “It's factoring in what's important to you, what limitations you've set, what data retention policies you've established, what keys you've brought in, what commits you might have … into that routing decision,” Schario said. </p><p>Replit, similarly, tends to have a better sense of the cost versus capability spectrum than its customers, Jain contended. “We are essentially making the decisions on users' behalf of what model to use when, in what capacity, to minimize cost and maximize capability.”</p><h2>To tokenmaxx or not to tokenmaxx</h2><p>Of course, an important consideration as AI adoption increases is runaway costs, which has led to some enterprises tracking and capping AI use through tokenmaxxing.</p><p>Concerns come from both sides, Schario said: internally and from customers. From the latter, she's hearing, "I accidentally spent my whole AI budget for the year … so what do I do now?" In response, Schario said Kilo Code points customers to the same workflow: use expensive models for planning, then open-weight models for affordability.</p><p>Further, sharing skills, strong guidance, and Model Context Protocol (MCP) will empower models. “Realizing where you can really uplevel your team to help them get the most out of the models they're using is going to make a big difference,” Schario said. </p><p>Internally, meanwhile, Schario noted one particular engineer that has a "heavy foot" and is constantly at the top of the usage board. "I regularly have to nudge, 'What are you doing there?'" she said. It's easy to look at a $600 bill for daily work and react, "Wow, that's so much," but looking at the amount of work completed can sometimes justify the cost.</p><p>“Cost per pull request is the metric that I'm paying attention to right now,” Schario said. “It feels like the closest proximity for how I can measure value.” Ultimately, AI changes how enterprises are thinking about ROI because spend is not the problem. “The spend with no return on that spend is the problem.” </p><p>Symbotic, for its part, has set per-month cost tiers for its employees. The company built a tool that gives managers visibility into PRs and usage trends. They can then move users up or down a tier as they see fit, Go explained. “Having a cap and seeing how many people went up in cap this month makes a big difference when you're trying to corral these costs and make things efficient,” Go said. </p><p>When Cursor — which Symbotic uses heavily — ended a legacy discount that had grandfathered the company into a flat per-request rate even for frontier models, and moved everyone to full pricing, it forced a company-wide reckoning on efficiency, Go said. "People were saying, 'You should try this model … This works better for this C# code, this whatever,'" he said.</p><p>But the cost problem is increasingly moving out of IT; Replit, for one, broadened agents beyond engineering, and eventually found that a user on the support side had "blown through an insane amount of money," Jain said. When they looked under the hood, they figured out it was because they were running an automation on GPT 5.5 Pro Max.</p><p>“At least till that point, the ROI was rather clear,” Jain said. “We could see engineering productivity 3X, so no one had questioned it yet.” </p><p>Visibility that isn’t “anti-productive,” model routing, and sensible defaults are critical, he emphasized. “Most tasks do not need the frontier.”</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[AWS Bedrock GPT Price Drop & CloudWatch Prometheus: What Developers Need to Know]]></title>
<description><![CDATA[I saw the AWS Weekly Roundup for August 3, 2026, and a couple of items immediately jumped out at me as a developer wrestling with both AI integration costs and observability headaches. Let's talk about the price reduction for GPT models in Bedrock and the new CloudWatch managed collectors for Pro...]]></description>
<link>https://tsecurity.de/de/3703337/sichere-programmierung/aws-bedrock-gpt-price-drop-cloudwatch-prometheus-what-developers-need-to-know/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3703337/sichere-programmierung/aws-bedrock-gpt-price-drop-cloudwatch-prometheus-what-developers-need-to-know/</guid>
<pubDate>Tue, 04 Aug 2026 15:30:27 +0200</pubDate>
<content:encoded><![CDATA[<p>I saw the AWS Weekly Roundup for August 3, 2026, and a couple of items immediately jumped out at me as a developer wrestling with both AI integration costs and observability headaches. Let's talk about the price reduction for GPT models in Bedrock and the new CloudWatch managed collectors for Prometheus metrics.</p>

<h3>
  
  
  Why the Bedrock GPT Price Drop Matters Now
</h3>

<p>Integrating large language models (LLMs) into applications has been a game-changer, but the operational costs can be a real killer, especially for smaller teams or projects just getting off the ground. When I'm building a new feature that leverages AI, the bill for those API calls is always a concern.</p>

<p>AWS Bedrock has been a fantastic way to access foundational models without managing the underlying infrastructure. The announcement of a price reduction for GPT models directly addresses one of the biggest friction points for widespread adoption: cost. While the specific percentage wasn't detailed in the roundup, <em>any</em> reduction in LLM inference costs is a win. It means I can potentially run more inferences, experiment more freely, or just see my operational budget stretch further. This is crucial for iterating on AI features, where prompt engineering and model fine-tuning often require many test runs.</p>

<p>Let's say I'm building a content summarization service. Previously, I might have to be very careful about how many articles I send through a GPT model to keep costs down. With a price drop, I can be a bit more generous, perhaps summarizing more frequently or offering longer summaries without as much budget anxiety.</p>

<p>Here’s a simplified example of how you might interact with Bedrock using the AWS SDK for JavaScript, assuming a hypothetical <code>invokeModel</code> call for a GPT model:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">BedrockRuntimeClient</span><span class="p">,</span> <span class="nx">InvokeModelCommand</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">@aws-sdk/client-bedrock-runtime</span><span class="dl">"</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">client</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">BedrockRuntimeClient</span><span class="p">({</span> <span class="na">region</span><span class="p">:</span> <span class="dl">"</span><span class="s2">us-east-1</span><span class="dl">"</span> <span class="p">});</span>

<span class="k">async</span> <span class="kd">function</span> <span class="nf">summarizeText</span><span class="p">(</span><span class="nx">textToSummarize</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">payload</span> <span class="o">=</span> <span class="p">{</span>
    <span class="na">prompt</span><span class="p">:</span> <span class="s2">`Summarize the following text:\n\n</span><span class="p">${</span><span class="nx">textToSummarize</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span>
    <span class="na">max_tokens_to_sample</span><span class="p">:</span> <span class="mi">200</span><span class="p">,</span>
    <span class="na">temperature</span><span class="p">:</span> <span class="mf">0.7</span><span class="p">,</span>
  <span class="p">};</span>

  <span class="kd">const</span> <span class="nx">command</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">InvokeModelCommand</span><span class="p">({</span>
    <span class="na">body</span><span class="p">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">payload</span><span class="p">),</span>
    <span class="na">modelId</span><span class="p">:</span> <span class="dl">"</span><span class="s2">amazon.titan-text-express-v1</span><span class="dl">"</span><span class="p">,</span> <span class="c1">// Replace with your specific GPT model ID if different</span>
    <span class="na">contentType</span><span class="p">:</span> <span class="dl">"</span><span class="s2">application/json</span><span class="dl">"</span><span class="p">,</span>
    <span class="na">accept</span><span class="p">:</span> <span class="dl">"</span><span class="s2">application/json</span><span class="dl">"</span><span class="p">,</span>
  <span class="p">});</span>

  <span class="k">try</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">client</span><span class="p">.</span><span class="nf">send</span><span class="p">(</span><span class="nx">command</span><span class="p">);</span>
    <span class="kd">const</span> <span class="nx">decodedBody</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">parse</span><span class="p">(</span><span class="k">new</span> <span class="nc">TextDecoder</span><span class="p">().</span><span class="nf">decode</span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">body</span><span class="p">));</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Summary:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">decodedBody</span><span class="p">.</span><span class="nx">completion</span><span class="p">);</span>
    <span class="k">return</span> <span class="nx">decodedBody</span><span class="p">.</span><span class="nx">completion</span><span class="p">;</span>
  <span class="p">}</span> <span class="k">catch </span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Error invoking Bedrock model:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
    <span class="k">throw</span> <span class="nx">error</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// Example usage:</span>
<span class="kd">const</span> <span class="nx">article</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">The quick brown fox jumped over the lazy dogs. This is a classic phrase used to demonstrate all letters of the alphabet.</span><span class="dl">"</span><span class="p">;</span>
<span class="nf">summarizeText</span><span class="p">(</span><span class="nx">article</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">then</span><span class="p">(</span><span class="nx">summary</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Generated summary:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">summary</span><span class="p">))</span>
  <span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="nx">err</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Failed to summarize:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">err</span><span class="p">));</span>
</code></pre>

</div>



<p>While this code doesn't directly show the price reduction, it illustrates the kind of interaction that becomes more economically viable with lower costs.</p>

<h3>
  
  
  CloudWatch Managed Collectors for Prometheus Metrics
</h3>

<p>This is a big one for anyone running containerized workloads, especially with Kubernetes. Prometheus has become the de-facto standard for monitoring cloud-native applications. However, managing Prometheus at scale, ensuring high availability, and integrating it seamlessly with other AWS services can be a pain. I've spent my fair share of time configuring scraping targets, storage, and alert managers.</p>

<p>The new CloudWatch managed collectors for Prometheus metrics sound like a significant step towards reducing that operational overhead. Instead of deploying and maintaining my own Prometheus server and all its components, AWS is offering a managed solution that integrates directly with CloudWatch. This means I can leverage CloudWatch's existing dashboards, alarms, and logging capabilities for my Prometheus metrics without having to jump through hoops.</p>

<p>For me, this means less time spent on infrastructure plumbing and more time focusing on what the metrics are telling me about my applications. It's about shifting from "how do I collect these metrics?" to "what insights can I gain from these metrics?". This is particularly valuable in a DevOps environment where engineers are expected to own the full lifecycle of their services.</p>

<p>Imagine you have a Kubernetes cluster running several microservices, and each exposes Prometheus metrics on a <code>/metrics</code> endpoint. With managed collectors, you could potentially configure CloudWatch to automatically discover and scrape these endpoints, pushing the data into CloudWatch Metrics. This simplifies the architecture and centralizes your monitoring.</p>

<p>While the exact configuration API wasn't detailed, it likely involves defining scraping configurations, similar to a <code>prometheus.yml</code>, but managed within the AWS console or via CloudFormation/CDK.</p>

<h3>
  
  
  My Take: Is it Worth Upgrading/Adopting?
</h3>

<p><strong>GPT Price Reduction:</strong> Absolutely. This isn't an "upgrade" in the traditional sense, but rather a direct cost benefit. If you're using GPT models in Bedrock, you'll likely see a reduction in your bill without changing a line of code. If you've been hesitant to adopt LLMs due to cost, this makes the barrier to entry lower. It's a no-brainer to leverage this.</p>

<p><strong>CloudWatch Managed Collectors for Prometheus:</strong> For anyone running Prometheus today, especially on Kubernetes, this is a strong contender for adoption. The real-world tradeoff is the potential vendor lock-in with CloudWatch, but the operational savings could be substantial. If you're already heavily invested in CloudWatch for other monitoring and logging, this could provide a unified observability plane. I'll be keeping a close eye on the setup complexity and pricing model. If it's as seamless as it sounds, the benefits of reduced operational burden and centralized monitoring will likely outweigh the costs for many teams, including mine.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[New OpenAI post doesn't address Apple's IP theft claims at all]]></title>
<description><![CDATA[In an attempt to refute Apple's intellectual property theft claims, Open AI doesn't address the theft, and instead leans on a racism claim, and a misdirected email to try to get the court of public opinion on its side.OpenAI CEO Sam Altman - image credit: Emerson CollectiveApple is suing OpenAI a...]]></description>
<link>https://tsecurity.de/de/3703141/apple-ios-macos/new-openai-post-doesnt-address-apples-ip-theft-claims-at-all/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3703141/apple-ios-macos/new-openai-post-doesnt-address-apples-ip-theft-claims-at-all/</guid>
<pubDate>Tue, 04 Aug 2026 14:22:27 +0200</pubDate>
<content:encoded><![CDATA[In an attempt to refute Apple's intellectual property theft claims, Open AI doesn't address the theft, and instead leans on a racism claim, and a misdirected email to try to get the court of public opinion on its side.<br><br><div><img src="https://photos5.appleinsider.com/gallery/68254-143883-000-lead-Sam-Altman-xl.jpg" alt="Man with short brown hair wearing a tan long sleeve shirt and clip-on microphone, seated against a dark background, looking slightly to the side with a neutral thoughtful expression" height="720" class=""><br><span>OpenAI CEO Sam Altman - image credit: Emerson Collective</span></div><br>Apple is <a href="https://tsecurity.de/weiterlesen/3674998/3703141/new-openai-post-doesnt-address-apples-ip-theft-claims-at-all/" target="_blank" rel="noopener noreferrer">suing OpenAI</a> and alleging that the ChatGPT company poached its staff with the express intention of learning trade secrets. OpenAI initially responded by trying to put the focus on emails Apple's lawyers mis-addressed, but now it has come out fighting.<br><br>In an <a href="https://tsecurity.de/weiterlesen/3674998/3703141/new-openai-post-doesnt-address-apples-ip-theft-claims-at-all/" target="_blank" rel="noopener noreferrer">open letter</a> called "Apple is getting this wrong," OpenAI still goes on about that mis-addressing, but now says its staff are blameless. It says that ex-Apple employee Chang Liu just tried to help when his colleagues reached out to him.<br><br><br> <a href="https://tsecurity.de/weiterlesen/3674998/3703141/new-openai-post-doesnt-address-apples-ip-theft-claims-at-all/" target="_blank" rel="noopener noreferrer">Continue Reading on AppleInsider</a> | <a href="https://tsecurity.de/weiterlesen/3674998/3703141/new-openai-post-doesnt-address-apples-ip-theft-claims-at-all/" target="_blank" rel="noopener noreferrer">Discuss on our Forums</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[Python Pandas Library]]></title>
<description><![CDATA[Pandas is an open-source library for data analysis and manipulation in Python. It provides fast, flexible and expressive data structures for working with relational and labelled data. Originally developed by Wes McKinney in 2008, it has become a foundational tool in modern data science and serves...]]></description>
<link>https://tsecurity.de/de/3702787/sichere-programmierung/python-pandas-library/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3702787/sichere-programmierung/python-pandas-library/</guid>
<pubDate>Tue, 04 Aug 2026 11:57:24 +0200</pubDate>
<content:encoded><![CDATA[<p>Pandas is an open-source library for data analysis and manipulation in Python. It provides fast, flexible and expressive data structures for working with relational and labelled data. Originally developed by Wes McKinney in 2008, it has become a foundational tool in modern data science and serves as a highly programmable analogue to spreadsheet software.</p>

<h2>
  
  
  Key characteristics
</h2>

<ul>
<li>
<strong>NumPy foundation:</strong> Built on top of NumPy, it inherits highly optimised, array-based computational performance.</li>
<li>
<strong>Label-driven alignment:</strong> Data are automatically aligned according to explicit row and column labels, thereby improving the reliability of calculations involving partially mismatched datasets.</li>
<li>
<strong>Heterogeneous typing:</strong> Unlike strict numerical arrays, Pandas can accommodate mixed data types, including integers, strings, floats and booleans, within a single tabular structure.</li>
<li>
<strong>Missing-data resilience:</strong> It provides native support for detecting, representing and handling missing values, such as NaN.</li>
</ul>

<h2>
  
  
  Core data structures
</h2>

<ul>
<li>
<strong>Series:</strong> A one-dimensional labelled array capable of holding any data type. In practical terms, it resembles a single column in a spreadsheet.</li>
<li>
<strong>DataFrame:</strong> A two-dimensional tabular data structure with labelled rows and columns. It may be regarded as a collection of Series sharing a common index, analogous to a table in SQL or a worksheet in Excel.</li>
</ul>

<h2>
  
  
  Core features and capabilities
</h2>

<ul>
<li>
<strong>Robust input/output parsing:</strong> Pandas supports efficient reading and writing across multiple formats, including CSV, Excel, SQL databases, JSON and Parquet.</li>
<li>
<strong>Advanced data cleaning:</strong> Built-in methods enable users to identify, filter and remove duplicates, and to impute missing values.</li>
<li>
<strong>Flexible wrangling and reshaping:</strong> The library facilitates pivoting, melting, slicing and subsetting operations based on conditional logic.</li>
<li>
<strong>High-performance merging:</strong> Relational operations such as inner, outer, left and right joins, as well as concatenation, can be executed in concise code.</li>
<li>
<strong>Split-apply-combine (GroupBy):</strong> Data may be grouped by specified criteria and summarised using aggregate operations such as sums, averages and custom calculations.</li>
<li>
<strong>Time-series functionality:</strong> Pandas provides specialised tools for handling dates, converting time zones, generating date ranges and resampling time-stamped data.</li>
<li>
<strong>Integrated plotting:</strong> It offers Matplotlib-based plotting utilities, enabling the rapid visualisation of tabular data with the .plot() interface.</li>
</ul>

<p>Time-series functionality and integrated plotting are not covered in this article.</p>

<h2>
  
  
  Practical examples
</h2>

<h3>
  
  
  Installation
</h3>

<p>Using pip:</p>

<pre>pip install pandas</pre>

<p>Using conda:</p>

<pre>conda install pandas</pre>

<p>Using poetry:</p>

<pre>poetry add pandas</pre>

<h3>
  
  
  Verify the installation
</h3>

<p>The following script may be used to confirm that pandas has been installed correctly.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>

<span class="nf">print</span><span class="p">(</span><span class="n">pd</span><span class="p">.</span><span class="n">__version__</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>3.0.5
</code></pre>

</div>
<h3>
  
  
  Creating DataFrame
</h3>

<p><em>from dictionary</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">Alice</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Bob</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Charlie</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">25</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">35</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">city</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">NYC</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">LA</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Chicago</span><span class="sh">'</span><span class="p">]</span>
<span class="p">})</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name  age     city
0    Alice   25      NYC
1      Bob   30       LA
2  Charlie   35  Chicago
</code></pre>

</div>

<p><em>from dictionary using NumPy</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="n">df_dict</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">Alice</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Bob</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Charlie</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">:</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mi">25</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="n">num</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">),</span>
    <span class="sh">'</span><span class="s">city</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">NYC</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">LA</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Chicago</span><span class="sh">'</span><span class="p">]</span>
<span class="p">})</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_dict</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name  age     city
0    Alice   25      NYC
1      Bob   30       LA
2  Charlie   35  Chicago
</code></pre>

</div>

<p><em>from list of lists</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_list</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">(</span>
    <span class="p">[[</span><span class="sh">'</span><span class="s">Alice</span><span class="sh">'</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="sh">'</span><span class="s">NYC</span><span class="sh">'</span> <span class="p">],</span> <span class="p">[</span><span class="sh">'</span><span class="s">Bob</span><span class="sh">'</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="sh">'</span><span class="s">LA</span><span class="sh">'</span><span class="p">],</span> <span class="p">[</span><span class="sh">'</span><span class="s">Charlie</span><span class="sh">'</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="sh">'</span><span class="s">Chicago</span><span class="sh">'</span><span class="p">]],</span> 
    <span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">city</span><span class="sh">'</span><span class="p">]</span>
<span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_list</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name  age     city
0    Alice   25      NYC
1      Bob   30       LA
2  Charlie   35  Chicago
</code></pre>

</div>

<p><em>from ndarray</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_ndarray</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">(</span>
    <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([[</span><span class="sh">'</span><span class="s">Alice</span><span class="sh">'</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="sh">'</span><span class="s">NYC</span><span class="sh">'</span><span class="p">],</span> <span class="p">[</span><span class="sh">'</span><span class="s">Bob</span><span class="sh">'</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="sh">'</span><span class="s">LA</span><span class="sh">'</span><span class="p">],</span> <span class="p">[</span><span class="sh">'</span><span class="s">Charlie</span><span class="sh">'</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="sh">'</span><span class="s">Chicago</span><span class="sh">'</span><span class="p">]]),</span>
    <span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">city</span><span class="sh">'</span><span class="p">]</span>
<span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_ndarray</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name age     city
0    Alice  25      NYC
1      Bob  30       LA
2  Charlie  35  Chicago
</code></pre>

</div>
<h3>
  
  
  Data inspection and information
</h3>

<p><em>basic info</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Shape: </span><span class="si">{</span><span class="n">df</span><span class="p">.</span><span class="n">shape</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>  <span class="c1"># (rows, columns)
</span><span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Column names: </span><span class="si">{</span><span class="n">df</span><span class="p">.</span><span class="n">columns</span><span class="p">.</span><span class="nf">tolist</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Data types:</span><span class="se">\n</span><span class="si">{</span><span class="n">df</span><span class="p">.</span><span class="n">dtypes</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">DataFrame Info:</span><span class="se">\n</span><span class="si">{</span><span class="n">df</span><span class="p">.</span><span class="nf">info</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Shape: (3, 3)
Column names: ['name', 'age', 'city']
Data types:
name      str
age     int64
city      str
dtype: object

&lt;class 'pandas.DataFrame'&gt;
RangeIndex: 3 entries, 0 to 2
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   name    3 non-null      str  
 1   age     3 non-null      int64
 2   city    3 non-null      str  
dtypes: int64(1), str(2)
memory usage: 204.0 bytes
DataFrame Info:
None
</code></pre>

</div>

<p><em>head and tail</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">First default number of rows:</span><span class="se">\n</span><span class="si">{</span><span class="n">df</span><span class="p">.</span><span class="nf">head</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">First 2 rows:</span><span class="se">\n</span><span class="si">{</span><span class="n">df</span><span class="p">.</span><span class="nf">head</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Last default number of rows:</span><span class="se">\n</span><span class="si">{</span><span class="n">df</span><span class="p">.</span><span class="nf">tail</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Last 2 rows:</span><span class="se">\n</span><span class="si">{</span><span class="n">df</span><span class="p">.</span><span class="nf">tail</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>First default number of rows:
      name  age     city
0    Alice   25      NYC
1      Bob   30       LA
2  Charlie   35  Chicago

First 2 rows:
    name  age city
0  Alice   25  NYC
1    Bob   30   LA

Last default number of rows:
      name  age     city
0    Alice   25      NYC
1      Bob   30       LA
2  Charlie   35  Chicago

Last 2 rows:
      name  age     city
1      Bob   30       LA
2  Charlie   35  Chicago
</code></pre>

</div>

<p><em>descriptive statistics for numerical columns</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">.</span><span class="nf">describe</span><span class="p">())</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>        age
count   3.0
mean   30.0
std     5.0
min    25.0
25%    27.5
50%    30.0
75%    32.5
max    35.0
</code></pre>

</div>

<p><em>descriptive statistics for all columns with transpose layout</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">.</span><span class="nf">describe</span><span class="p">(</span><span class="n">include</span><span class="o">=</span><span class="sh">'</span><span class="s">all</span><span class="sh">'</span><span class="p">).</span><span class="n">T</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>     count unique    top freq  mean  std   min   25%   50%   75%   max
name     3      3  Alice    1   NaN  NaN   NaN   NaN   NaN   NaN   NaN
age    3.0    NaN    NaN  NaN  30.0  5.0  25.0  27.5  30.0  32.5  35.0
city     3      3    NYC    1   NaN  NaN   NaN   NaN   NaN   NaN   NaN
</code></pre>

</div>

<p><em>unique and missing values</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Unique values in </span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="s">:</span><span class="se">\n</span><span class="s"> </span><span class="si">{</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">].</span><span class="nf">unique</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Null values:</span><span class="se">\n</span><span class="s"> </span><span class="si">{</span><span class="n">df</span><span class="p">.</span><span class="nf">isnull</span><span class="p">().</span><span class="nf">sum</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Unique values in 'name':
 &lt;StringArray&gt;
['Alice', 'Bob', 'Charlie']
Length: 3, dtype: str

Null values:
 name    0
age     0
city    0
dtype: int64
</code></pre>

</div>
<h3>
  
  
  Selecting data by columns and rows
</h3>

<p><em>select column - returns Series</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">])</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>0      Alice
1        Bob
2    Charlie
Name: name, dtype: str
</code></pre>

</div>

<p><em>select multiple columns</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">[[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">]])</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name  age
0    Alice   25
1      Bob   30
2  Charlie   35
</code></pre>

</div>

<p><em>select by position (iloc)</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Select first 2 rows, first 2 columns (iloc):</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">.</span><span class="n">iloc</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">2</span><span class="p">,</span> <span class="mi">0</span><span class="p">:</span><span class="mi">2</span><span class="p">])</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Select first 2 rows, first 2 columns (iloc):
    name  age
0  Alice   25
1    Bob   30
</code></pre>

</div>

<p><em>select by label (loc)</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Select by label using loc:</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">.</span><span class="n">loc</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>  <span class="c1"># First row
</span><span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">.</span><span class="n">loc</span><span class="p">[</span><span class="mi">0</span><span class="p">:</span><span class="mi">1</span><span class="p">,</span> <span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">]])</span>  <span class="c1"># First 2 rows, specific columns
</span></code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Select by label using loc:
name    Alice
age        25
city      NYC
Name: 0, dtype: object
    name  age
0  Alice   25
1    Bob   30
</code></pre>

</div>
<h3>
  
  
  Filtering and conditional selection
</h3>

<p><em>simple filter</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">25</span><span class="p">])</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name  age     city
1      Bob   30       LA
2  Charlie   35  Chicago
</code></pre>

</div>

<p><em>multiple conditions with AND</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Age &gt; 25 AND city == </span><span class="sh">'</span><span class="s">LA</span><span class="sh">'</span><span class="s">:</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">[(</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">25</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">city</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">LA</span><span class="sh">'</span><span class="p">)])</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Age &gt; 25 AND city == 'LA':
  name  age city
1  Bob   30   LA
</code></pre>

</div>

<p><em>multiple conditions with OR</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Age == 25 OR city == </span><span class="sh">'</span><span class="s">Chicago</span><span class="sh">'</span><span class="s">:</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">[(</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="mi">25</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">city</span><span class="sh">'</span><span class="p">]</span> <span class="o">==</span> <span class="sh">'</span><span class="s">Chicago</span><span class="sh">'</span><span class="p">)])</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Age == 25 OR city == 'Chicago':
      name  age     city
0    Alice   25      NYC
2  Charlie   35  Chicago
</code></pre>

</div>

<p><em>multiple values using list</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">City in [</span><span class="sh">'</span><span class="s">NYC</span><span class="sh">'</span><span class="s">, </span><span class="sh">'</span><span class="s">Chicago</span><span class="sh">'</span><span class="s">]:</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">city</span><span class="sh">'</span><span class="p">].</span><span class="nf">isin</span><span class="p">([</span><span class="sh">'</span><span class="s">NYC</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Chicago</span><span class="sh">'</span><span class="p">])])</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>City in ['NYC', 'Chicago']:
      name  age     city
0    Alice   25      NYC
2  Charlie   35  Chicago
</code></pre>

</div>

<p><em>string filtering</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">City starts with </span><span class="sh">'</span><span class="s">L</span><span class="sh">'</span><span class="s">:</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">[</span><span class="n">df</span><span class="p">[</span><span class="sh">'</span><span class="s">city</span><span class="sh">'</span><span class="p">].</span><span class="nb">str</span><span class="p">.</span><span class="nf">startswith</span><span class="p">(</span><span class="sh">'</span><span class="s">L</span><span class="sh">'</span><span class="p">)])</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>City starts with 'L':
  name  age city
1  Bob   30   LA
</code></pre>

</div>

<p><em>filter using query method</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df</span><span class="p">.</span><span class="nf">query</span><span class="p">(</span><span class="sh">'</span><span class="s">age &gt; 25</span><span class="sh">'</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name  age     city
1      Bob   30       LA
2  Charlie   35  Chicago
</code></pre>

</div>
<h3>
  
  
  Adding and modifying columns
</h3>

<p>It is good practice to avoid modifying the original DataFrame when adding, deleting or altering data. For this reason, a deep copy of the DataFrame is used in the examples that follow.</p>

<p><em>hard copy dataframe</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_copy</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="nf">copy</span><span class="p">()</span>

<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Copy of Original DataFrame: </span><span class="se">\n</span><span class="si">{</span><span class="n">df_copy</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Copy of Original DataFrame: 
      name  age     city
0    Alice   25      NYC
1      Bob   30       LA
2  Charlie   35  Chicago
</code></pre>

</div>

<p><em>add new column</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_copy</span><span class="p">[</span><span class="sh">'</span><span class="s">age_next_year</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_copy</span><span class="p">[</span><span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_copy</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name  age     city  age_next_year
0    Alice   25      NYC             26
1      Bob   30       LA             31
2  Charlie   35  Chicago             36
</code></pre>

</div>

<p><em>modify existing column with lambda function</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_copy</span><span class="p">[</span><span class="sh">'</span><span class="s">age_group</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_copy</span><span class="p">[</span><span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">].</span><span class="nf">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="sh">'</span><span class="s">Young</span><span class="sh">'</span> <span class="k">if</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="mi">30</span> <span class="k">else</span> <span class="sh">'</span><span class="s">Older</span><span class="sh">'</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_copy</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name  age     city  age_next_year age_group
0    Alice   25      NYC             26     Young
1      Bob   30       LA             31     Older
2  Charlie   35  Chicago             36     Older
</code></pre>

</div>

<p><em>conditional assignment (using np.where)</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_copy</span><span class="p">[</span><span class="sh">'</span><span class="s">status</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">where</span><span class="p">(</span><span class="n">df_copy</span><span class="p">[</span><span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">25</span><span class="p">,</span> <span class="sh">'</span><span class="s">Senior</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Junior</span><span class="sh">'</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_copy</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name  age     city  age_next_year age_group  status
0    Alice   25      NYC             26     Young  Junior
1      Bob   30       LA             31     Older  Senior
2  Charlie   35  Chicago             36     Older  Senior
</code></pre>

</div>

<p><em>rename columns</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_copy</span> <span class="o">=</span> <span class="n">df_copy</span><span class="p">.</span><span class="nf">rename</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="p">{</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">full_name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">city</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">location</span><span class="sh">'</span><span class="p">})</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df_copy</span><span class="p">)</span>

<span class="n">df_copy</span><span class="p">.</span><span class="nf">rename</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="p">{</span><span class="sh">'</span><span class="s">full_name</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">location</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">city</span><span class="sh">'</span><span class="p">},</span> <span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df_copy</span><span class="p">)</span>

</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Rename columns:
  full_name  age location  age_next_year age_group  status
0     Alice   25      NYC             26     Young  Junior
1       Bob   30       LA             31     Older  Senior
2   Charlie   35  Chicago             36     Older  Senior
Rename columns back using inplace:
      name  age     city  age_next_year age_group  status
0    Alice   25      NYC             26     Young  Junior
1      Bob   30       LA             31     Older  Senior
2  Charlie   35  Chicago             36     Older  Senior
</code></pre>

</div>

<p><em>drop columns</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_dropped</span> <span class="o">=</span> <span class="n">df_copy</span><span class="p">.</span><span class="nf">drop</span><span class="p">(</span><span class="n">columns</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">city</span><span class="sh">'</span><span class="p">])</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_dropped</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name  age  age_next_year age_group  status
0    Alice   25             26     Young  Junior
1      Bob   30             31     Older  Senior
2  Charlie   35             36     Older  Senior
</code></pre>

</div>
<h3>
  
  
  Data cleaning and missing values
</h3>

<p><em>sample dataframe with missing values</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_missing</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">Alice</span><span class="sh">'</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="sh">'</span><span class="s">Charlie</span><span class="sh">'</span><span class="p">,</span> <span class="bp">None</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">25</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="n">np</span><span class="p">.</span><span class="n">nan</span><span class="p">,</span> <span class="mi">40</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">city</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">NYC</span><span class="sh">'</span><span class="p">,</span> <span class="bp">None</span><span class="p">,</span> <span class="sh">'</span><span class="s">Chicago</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">LA</span><span class="sh">'</span><span class="p">]</span>
<span class="p">})</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">DataFrame with missing values:</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df_missing</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>DataFrame with missing values:
      name   age     city
0    Alice  25.0      NYC
1      NaN  30.0      NaN
2  Charlie   NaN  Chicago
3      NaN  40.0       LA
</code></pre>

</div>

<p><em>check for missing values using info</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_missing</span><span class="p">.</span><span class="nf">info</span><span class="p">())</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>&lt;class 'pandas.DataFrame'&gt;
RangeIndex: 4 entries, 0 to 3
Data columns (total 3 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   name    2 non-null      str    
 1   age     3 non-null      float64
 2   city    3 non-null      str    
dtypes: float64(1), str(2)
memory usage: 228.0 bytes
None
</code></pre>

</div>

<p>There are four records in the sample DataFrame. The 'name' column contains two non-null values, while the 'age' and 'city' columns contain three non-null values each.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Check for missing values:</span><span class="se">\n</span><span class="si">{</span><span class="n">df_missing</span><span class="p">.</span><span class="nf">isnull</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Check for missing values:</span><span class="se">\n</span><span class="si">{</span><span class="n">df_missing</span><span class="p">.</span><span class="nf">isnull</span><span class="p">().</span><span class="nf">sum</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Check for missing values:
    name    age   city
0  False  False  False
1   True  False   True
2  False   True  False
3   True  False  False

Check for missing values:
name    2
age     1
city    1
dtype: int64
</code></pre>

</div>

<p><em>drop rows with missing values</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="c1"># Drop rows with any missing values
</span><span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">df_missing</span><span class="p">.</span><span class="nf">dropna</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>

<span class="c1"># Drop rows where specific column is missing
</span><span class="nf">print</span><span class="p">(</span><span class="n">df_missing</span><span class="p">.</span><span class="nf">dropna</span><span class="p">(</span><span class="n">subset</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">]))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Drop rows with missing values:
    name   age city
0  Alice  25.0  NYC

Drop rows where 'age' is missing:
    name   age city
0  Alice  25.0  NYC
1    NaN  30.0  NaN
3    NaN  40.0   LA
</code></pre>

</div>

<p><em>fill missing values</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="c1"># Fill missing values with 0
</span><span class="nf">print</span><span class="p">(</span><span class="n">df_missing</span><span class="p">.</span><span class="nf">fillna</span><span class="p">(</span><span class="mi">0</span><span class="p">))</span>
<span class="nf">print</span><span class="p">()</span>

<span class="c1"># Fill missing values with forward fill
</span><span class="nf">print</span><span class="p">(</span><span class="n">df_missing</span><span class="p">.</span><span class="nf">ffill</span><span class="p">())</span>
<span class="nf">print</span><span class="p">()</span>

<span class="c1"># Fill with mean
</span><span class="n">df_missing</span><span class="p">[</span><span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_missing</span><span class="p">[</span><span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">].</span><span class="nf">fillna</span><span class="p">(</span><span class="n">df_missing</span><span class="p">[</span><span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">].</span><span class="nf">mean</span><span class="p">())</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df_missing</span><span class="p">)</span>
<span class="nf">print</span><span class="p">()</span>

</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name   age     city
0    Alice  25.0      NYC
1        0  30.0        0
2  Charlie   0.0  Chicago
3        0  40.0       LA

      name   age     city
0    Alice  25.0      NYC
1    Alice  30.0      NYC
2  Charlie  30.0  Chicago
3  Charlie  40.0       LA

      name        age     city
0    Alice  25.000000      NYC
1      NaN  30.000000      NaN
2  Charlie  31.666667  Chicago
3      NaN  40.000000       LA
</code></pre>

</div>
<h3>
  
  
  Grouping and aggregation
</h3>

<p><em>sample dataframe</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_sales</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">department</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">Sales</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Sales</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">IT</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">IT</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">HR</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">HR</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">employee</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">Alice</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Bob</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Charlie</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">David</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Eve</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Frank</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">50000</span><span class="p">,</span> <span class="mi">55000</span><span class="p">,</span> <span class="mi">75000</span><span class="p">,</span> <span class="mi">75000</span><span class="p">,</span> <span class="mi">45000</span><span class="p">,</span> <span class="mi">48000</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">bonus</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">5000</span><span class="p">,</span> <span class="mi">6000</span><span class="p">,</span> <span class="mi">10000</span><span class="p">,</span> <span class="mi">12000</span><span class="p">,</span> <span class="mi">3000</span><span class="p">,</span> <span class="mi">2000</span><span class="p">]</span>
<span class="p">})</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df_sales</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>  department employee  salary  bonus
0      Sales    Alice   50000   5000
1      Sales      Bob   55000   6000
2         IT  Charlie   75000  10000
3         IT    David   75000  12000
4         HR      Eve   45000   3000
5         HR    Frank   48000   2000
</code></pre>

</div>

<p><em>group by single column</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_sales</span><span class="p">.</span><span class="nf">groupby</span><span class="p">(</span><span class="sh">'</span><span class="s">department</span><span class="sh">'</span><span class="p">)[</span><span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">].</span><span class="nf">mean</span><span class="p">())</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>department
HR       46500.0
IT       75000.0
Sales    52500.0
Name: salary, dtype: float64
</code></pre>

</div>

<p><em>group by and aggregate multiple columns</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">agg_result</span> <span class="o">=</span> <span class="n">df_sales</span><span class="p">.</span><span class="nf">groupby</span><span class="p">(</span><span class="sh">'</span><span class="s">department</span><span class="sh">'</span><span class="p">).</span><span class="nf">agg</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">mean</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">sum</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">count</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">bonus</span><span class="sh">'</span><span class="p">:</span> <span class="sh">'</span><span class="s">mean</span><span class="sh">'</span>
<span class="p">})</span>
<span class="nf">print</span><span class="p">(</span><span class="n">agg_result</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>             salary                  bonus
               mean     sum count     mean
department                                
HR          46500.0   93000     2   2500.0
IT          75000.0  150000     2  11000.0
Sales       52500.0  105000     2   5500.0
</code></pre>

</div>

<p><em>custom aggregation names</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_sales</span><span class="p">.</span><span class="nf">groupby</span><span class="p">(</span><span class="sh">'</span><span class="s">department</span><span class="sh">'</span><span class="p">).</span><span class="nf">agg</span><span class="p">(</span>
    <span class="n">avg_salary</span><span class="o">=</span><span class="p">(</span><span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">mean</span><span class="sh">'</span><span class="p">),</span>
    <span class="n">total_bonus</span><span class="o">=</span><span class="p">(</span><span class="sh">'</span><span class="s">bonus</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">sum</span><span class="sh">'</span><span class="p">),</span>
    <span class="n">count</span><span class="o">=</span><span class="p">(</span><span class="sh">'</span><span class="s">employee</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">count</span><span class="sh">'</span><span class="p">)</span>
<span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>            avg_salary  total_bonus  count
department                                
HR             46500.0         5000      2
IT             75000.0        22000      2
Sales          52500.0        11000      2
</code></pre>

</div>

<p><em>group by multiple columns</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_sales</span><span class="p">[</span><span class="sh">'</span><span class="s">year</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">2023</span><span class="p">,</span> <span class="mi">2023</span><span class="p">,</span> <span class="mi">2024</span><span class="p">,</span> <span class="mi">2024</span><span class="p">,</span> <span class="mi">2023</span><span class="p">,</span> <span class="mi">2024</span><span class="p">]</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_sales</span><span class="p">.</span><span class="nf">groupby</span><span class="p">([</span><span class="sh">'</span><span class="s">department</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">year</span><span class="sh">'</span><span class="p">])[</span><span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">].</span><span class="nf">mean</span><span class="p">())</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>department  year
HR          2023    45000.0
            2024    48000.0
IT          2024    75000.0
Sales       2023    52500.0
Name: salary, dtype: float64
</code></pre>

</div>
<h3>
  
  
  Sorting and ranking
</h3>

<p><em>sort by single column ascending</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_sales</span><span class="p">.</span><span class="nf">sort_values</span><span class="p">(</span><span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>  department employee  salary  bonus  year
4         HR      Eve   45000   3000  2023
5         HR    Frank   48000   2000  2024
0      Sales    Alice   50000   5000  2023
1      Sales      Bob   55000   6000  2023
3         IT    David   75000  12000  2024
2         IT  Charlie   75000  10000  2024
</code></pre>

</div>

<p><em>sort by single column descending</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_sales</span><span class="p">.</span><span class="nf">sort_values</span><span class="p">(</span><span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">,</span> <span class="n">ascending</span><span class="o">=</span><span class="bp">False</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>  department employee  salary  bonus  year
3         IT    David   75000  12000  2024
2         IT  Charlie   75000  10000  2024
1      Sales      Bob   55000   6000  2023
0      Sales    Alice   50000   5000  2023
5         HR    Frank   48000   2000  2024
4         HR      Eve   45000   3000  2023
</code></pre>

</div>

<p><em>sort by multiple columns</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_sales</span><span class="p">.</span><span class="nf">sort_values</span><span class="p">([</span><span class="sh">'</span><span class="s">department</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">]))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>  department employee  salary  bonus  year
4         HR      Eve   45000   3000  2023
5         HR    Frank   48000   2000  2024
2         IT  Charlie   75000  10000  2024
3         IT    David   75000  12000  2024
0      Sales    Alice   50000   5000  2023
1      Sales      Bob   55000   6000  2023
</code></pre>

</div>

<p><em>sort by index</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="c1"># create a new DataFrame with 'employee' as the index
</span><span class="n">df_index</span> <span class="o">=</span> <span class="n">df_sales</span><span class="p">.</span><span class="nf">set_index</span><span class="p">(</span><span class="sh">'</span><span class="s">employee</span><span class="sh">'</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_index</span><span class="p">.</span><span class="nf">sort_index</span><span class="p">())</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>         department  salary  bonus  year
employee                                
Alice         Sales   50000   5000  2023
Bob           Sales   55000   6000  2023
Charlie          IT   75000  10000  2024
David            IT   75000  12000  2024
Eve              HR   45000   3000  2023
Frank            HR   48000   2000  2024
</code></pre>

</div>

<p><em>ranking</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_sales</span><span class="p">[</span><span class="sh">'</span><span class="s">salary_rank</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_sales</span><span class="p">[</span><span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">].</span><span class="nf">rank</span><span class="p">(</span><span class="n">ascending</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_sales</span><span class="p">[[</span><span class="sh">'</span><span class="s">employee</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">salary_rank</span><span class="sh">'</span><span class="p">]])</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>  employee  salary  salary_rank
0    Alice   50000          4.0
1      Bob   55000          3.0
2  Charlie   75000          1.5
3    David   75000          1.5
4      Eve   45000          6.0
5    Frank   48000          5.0
</code></pre>

</div>

<p><em>dense ranking</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_sales</span><span class="p">[</span><span class="sh">'</span><span class="s">salary_dense_rank</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_sales</span><span class="p">[</span><span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">].</span><span class="nf">rank</span><span class="p">(</span><span class="n">method</span><span class="o">=</span><span class="sh">'</span><span class="s">dense</span><span class="sh">'</span><span class="p">,</span> <span class="n">ascending</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_sales</span><span class="p">[[</span><span class="sh">'</span><span class="s">employee</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">salary_dense_rank</span><span class="sh">'</span><span class="p">]])</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>  employee  salary  salary_dense_rank
0    Alice   50000                3.0
1      Bob   55000                2.0
2  Charlie   75000                1.0
3    David   75000                1.0
4      Eve   45000                5.0
5    Frank   48000                4.0
</code></pre>

</div>
<h3>
  
  
  Merging and joining DataFrames
</h3>

<p><em>sample dataframes df1, df2 and df3</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df1</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">id</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">Alice</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Bob</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Charlie</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">department</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">Sales</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">IT</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">HR</span><span class="sh">'</span><span class="p">]</span>
<span class="p">})</span>

<span class="n">df2</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">id</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">50000</span><span class="p">,</span> <span class="mi">70000</span><span class="p">,</span> <span class="mi">45000</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">bonus</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">5000</span><span class="p">,</span> <span class="mi">10000</span><span class="p">,</span> <span class="mi">3000</span><span class="p">]</span>
<span class="p">})</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df1</span><span class="p">)</span>
<span class="nf">print</span><span class="p">()</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df2</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>   id     name department
0   1    Alice      Sales
1   2      Bob         IT
2   3  Charlie         HR

   id  salary  bonus
0   1   50000   5000
1   2   70000  10000
2   3   45000   3000
</code></pre>

</div>

<p><em>inner join (intersection)</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">pd</span><span class="p">.</span><span class="nf">merge</span><span class="p">(</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">,</span> <span class="n">on</span><span class="o">=</span><span class="sh">'</span><span class="s">id</span><span class="sh">'</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>   id     name department  salary  bonus
0   1    Alice      Sales   50000   5000
1   2      Bob         IT   70000  10000
2   3  Charlie         HR   45000   3000
</code></pre>

</div>

<p><em>left join</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df3</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">id</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">salary</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">50000</span><span class="p">,</span> <span class="mi">70000</span><span class="p">,</span> <span class="mi">80000</span><span class="p">]</span>
<span class="p">})</span>

<span class="nf">print</span><span class="p">(</span><span class="n">pd</span><span class="p">.</span><span class="nf">merge</span><span class="p">(</span><span class="n">df1</span><span class="p">,</span> <span class="n">df3</span><span class="p">,</span> <span class="n">on</span><span class="o">=</span><span class="sh">'</span><span class="s">id</span><span class="sh">'</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="sh">'</span><span class="s">left</span><span class="sh">'</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>   id     name department   salary
0   1    Alice      Sales  50000.0
1   2      Bob         IT  70000.0
2   3  Charlie         HR      NaN
</code></pre>

</div>

<p><em>right join</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">pd</span><span class="p">.</span><span class="nf">merge</span><span class="p">(</span><span class="n">df1</span><span class="p">,</span> <span class="n">df3</span><span class="p">,</span> <span class="n">on</span><span class="o">=</span><span class="sh">'</span><span class="s">id</span><span class="sh">'</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="sh">'</span><span class="s">right</span><span class="sh">'</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>   id   name department  salary
0   1  Alice      Sales   50000
1   2    Bob         IT   70000
2   4    NaN        NaN   80000
</code></pre>

</div>

<p><em>outer join (union)</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">pd</span><span class="p">.</span><span class="nf">merge</span><span class="p">(</span><span class="n">df1</span><span class="p">,</span> <span class="n">df3</span><span class="p">,</span> <span class="n">on</span><span class="o">=</span><span class="sh">'</span><span class="s">id</span><span class="sh">'</span><span class="p">,</span> <span class="n">how</span><span class="o">=</span><span class="sh">'</span><span class="s">outer</span><span class="sh">'</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>   id     name department   salary
0   1    Alice      Sales  50000.0
1   2      Bob         IT  70000.0
2   3  Charlie         HR      NaN
3   4      NaN        NaN  80000.0
</code></pre>

</div>

<p><em>concatenate vertically</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">pd</span><span class="p">.</span><span class="nf">concat</span><span class="p">([</span><span class="n">df1</span><span class="p">,</span> <span class="n">df1</span><span class="p">],</span> <span class="n">ignore_index</span><span class="o">=</span><span class="bp">True</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>   id     name department
0   1    Alice      Sales
1   2      Bob         IT
2   3  Charlie         HR
3   1    Alice      Sales
4   2      Bob         IT
5   3  Charlie         HR
</code></pre>

</div>

<p><em>concatenate horizontally</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">pd</span><span class="p">.</span><span class="nf">concat</span><span class="p">([</span><span class="n">df1</span><span class="p">,</span> <span class="n">df2</span><span class="p">],</span> <span class="n">axis</span><span class="o">=</span><span class="mi">1</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>   id     name department  id  salary  bonus
0   1    Alice      Sales   1   50000   5000
1   2      Bob         IT   2   70000  10000
2   3  Charlie         HR   3   45000   3000
</code></pre>

</div>
<h3>
  
  
  Reshaping data using pivot tables
</h3>

<p><em>sample dataframe1</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_pivot</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">product</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">C</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">C</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">month</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">Jan</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Feb</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Jan</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Feb</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Jan</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Feb</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">sales</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">150</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">300</span><span class="p">,</span> <span class="mi">350</span><span class="p">]</span>
<span class="p">})</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_pivot</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>  product month  sales
0       A   Jan    100
1       A   Feb    150
2       B   Jan    200
3       B   Feb    250
4       C   Jan    300
5       C   Feb    350
</code></pre>

</div>

<p><em>pivot table</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">pivot</span> <span class="o">=</span> <span class="n">df_pivot</span><span class="p">.</span><span class="nf">pivot</span><span class="p">(</span><span class="n">index</span><span class="o">=</span><span class="sh">'</span><span class="s">product</span><span class="sh">'</span><span class="p">,</span> <span class="n">columns</span><span class="o">=</span><span class="sh">'</span><span class="s">month</span><span class="sh">'</span><span class="p">,</span> <span class="n">values</span><span class="o">=</span><span class="sh">'</span><span class="s">sales</span><span class="sh">'</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">pivot</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>month    Feb  Jan
product          
A        150  100
B        250  200
C        350  300
</code></pre>

</div>

<p><em>sample dataframe2</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_pivot2</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">region</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">North</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">South</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">North</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">South</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">North</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">South</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">sales</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">150</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">300</span><span class="p">]</span>
<span class="p">})</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_pivot2</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>  category region  sales
0        A  North    100
1        A  South    150
2        A  North    120
3        B  South    200
4        B  North    250
5        B  South    300
</code></pre>

</div>

<p><em>pivot with aggregation</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">pivot_agg</span> <span class="o">=</span> <span class="n">df_pivot2</span><span class="p">.</span><span class="nf">pivot_table</span><span class="p">(</span>
    <span class="n">index</span><span class="o">=</span><span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">,</span> 
    <span class="n">columns</span><span class="o">=</span><span class="sh">'</span><span class="s">region</span><span class="sh">'</span><span class="p">,</span> 
    <span class="n">values</span><span class="o">=</span><span class="sh">'</span><span class="s">sales</span><span class="sh">'</span><span class="p">,</span> 
    <span class="n">aggfunc</span><span class="o">=</span><span class="sh">'</span><span class="s">sum</span><span class="sh">'</span>
<span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">pivot_agg</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>region    North  South
category              
A           220    150
B           250    500
</code></pre>

</div>

<p><em>unstack</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_stacked</span> <span class="o">=</span> <span class="n">df_pivot</span><span class="p">.</span><span class="nf">set_index</span><span class="p">([</span><span class="sh">'</span><span class="s">product</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">month</span><span class="sh">'</span><span class="p">])[</span><span class="sh">'</span><span class="s">sales</span><span class="sh">'</span><span class="p">]</span>
<span class="n">df_unstacked</span> <span class="o">=</span> <span class="n">df_stacked</span><span class="p">.</span><span class="nf">unstack</span><span class="p">()</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_stacked</span><span class="p">)</span>
<span class="nf">print</span><span class="p">()</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df_unstacked</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>product  month
A        Jan      100
         Feb      150
B        Jan      200
         Feb      250
C        Jan      300
         Feb      350
Name: sales, dtype: int64

month    Feb  Jan
product          
A        150  100
B        250  200
C        350  300
</code></pre>

</div>

<p><em>melt (unpivot)</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_melted</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">melt</span><span class="p">(</span><span class="n">df_unstacked</span><span class="p">.</span><span class="nf">reset_index</span><span class="p">(),</span> <span class="n">id_vars</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">product</span><span class="sh">'</span><span class="p">],</span> <span class="n">var_name</span><span class="o">=</span><span class="sh">'</span><span class="s">variable</span><span class="sh">'</span><span class="p">,</span> <span class="n">value_name</span><span class="o">=</span><span class="sh">'</span><span class="s">value</span><span class="sh">'</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_melted</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>  product variable  value
0       A      Feb    150
1       B      Feb    250
2       C      Feb    350
3       A      Jan    100
4       B      Jan    200
5       C      Jan    300
</code></pre>

</div>
<h3>
  
  
  String operations
</h3>

<p><em>sample dataframe</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_str</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">alice smith</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">bob jones</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">charlie brown</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">email</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">alice@email.com</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">bob@email.com</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">charlie@email.com</span><span class="sh">'</span><span class="p">]</span>
<span class="p">})</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_str</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>            name              email
0    alice smith    alice@email.com
1      bob jones      bob@email.com
2  charlie brown  charlie@email.com
</code></pre>

</div>

<p><em>string upper, title case</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_str</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">].</span><span class="nb">str</span><span class="p">.</span><span class="nf">upper</span><span class="p">())</span>
<span class="nf">print</span><span class="p">()</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_str</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">].</span><span class="nb">str</span><span class="p">.</span><span class="nf">title</span><span class="p">())</span>
<span class="nf">print</span><span class="p">()</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>0      ALICE SMITH
1        BOB JONES
2    CHARLIE BROWN
Name: name, dtype: str

0      Alice Smith
1        Bob Jones
2    Charlie Brown
Name: name, dtype: str
</code></pre>

</div>

<p><em>string lenght</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_str</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">].</span><span class="nb">str</span><span class="p">.</span><span class="nf">len</span><span class="p">())</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>0    11
1     9
2    13
Name: name, dtype: int64
</code></pre>

</div>

<p><em>string contains</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_str</span><span class="p">[</span><span class="n">df_str</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">].</span><span class="nb">str</span><span class="p">.</span><span class="nf">contains</span><span class="p">(</span><span class="sh">'</span><span class="s">alice</span><span class="sh">'</span><span class="p">)])</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>          name            email
0  alice smith  alice@email.com
</code></pre>

</div>

<p><em>extract part of string</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_str</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">].</span><span class="nb">str</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s"> </span><span class="sh">'</span><span class="p">).</span><span class="nb">str</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="nf">print</span><span class="p">()</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df_str</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">].</span><span class="nb">str</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s"> </span><span class="sh">'</span><span class="p">).</span><span class="nb">str</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>0      alice
1        bob
2    charlie
Name: name, dtype: object

0    smith
1    jones
2    brown
Name: name, dtype: object
</code></pre>

</div>

<p><em>replace part of string</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_str</span><span class="p">[</span><span class="sh">'</span><span class="s">name</span><span class="sh">'</span><span class="p">].</span><span class="nb">str</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">smith</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">Smith</span><span class="sh">'</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>0      alice Smith
1        bob jones
2    charlie brown
Name: name, dtype: str
</code></pre>

</div>

<p><em>extract digits from string</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_codes</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span><span class="sh">'</span><span class="s">code</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">A123</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">B456</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">C789</span><span class="sh">'</span><span class="p">]})</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df_codes</span><span class="p">)</span>
<span class="nf">print</span><span class="p">()</span>

<span class="n">df_codes</span><span class="p">[</span><span class="sh">'</span><span class="s">code</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_codes</span><span class="p">[</span><span class="sh">'</span><span class="s">code</span><span class="sh">'</span><span class="p">].</span><span class="nb">str</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sa">r</span><span class="sh">'</span><span class="s">\D</span><span class="sh">'</span><span class="p">,</span> <span class="sh">''</span><span class="p">,</span> <span class="n">regex</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df_codes</span><span class="p">)</span>

</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>   code
0  A123
1  B456
2  C789

  code
0  123
1  456
2  789
</code></pre>

</div>

<p><em>get domain from email address</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_str</span><span class="p">[</span><span class="sh">'</span><span class="s">email</span><span class="sh">'</span><span class="p">].</span><span class="nb">str</span><span class="p">.</span><span class="nf">extract</span><span class="p">(</span><span class="sa">r</span><span class="sh">'</span><span class="s">@([a-z]+)\.com</span><span class="sh">'</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>       0
0  email
1  email
2  email
</code></pre>

</div>
<h3>
  
  
  Datetime operations
</h3>

<p><em>sample dataframe</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_dates</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">2024-01-15</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">2024-02-20</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">2024-03-10</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">value</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">150</span><span class="p">,</span> <span class="mi">200</span><span class="p">]</span>
<span class="p">})</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_dates</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df_dates</span><span class="p">.</span><span class="n">dtypes</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>         date  value
0  2024-01-15    100
1  2024-02-20    150
2  2024-03-10    200
date       str
value    int64
dtype: object
</code></pre>

</div>

<p><em>convert to datetime type</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">to_datetime</span><span class="p">(</span><span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">])</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_dates</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">df_dates</span><span class="p">.</span><span class="n">dtypes</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>        date  value
0 2024-01-15    100
1 2024-02-20    150
2 2024-03-10    200
date     datetime64[us]
value             int64
dtype: object
</code></pre>

</div>

<p><em>extract components</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">year</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">].</span><span class="n">dt</span><span class="p">.</span><span class="n">year</span>
<span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">month</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">].</span><span class="n">dt</span><span class="p">.</span><span class="n">month</span>
<span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">day</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">].</span><span class="n">dt</span><span class="p">.</span><span class="n">day</span>
<span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">day_name</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">].</span><span class="n">dt</span><span class="p">.</span><span class="nf">day_name</span><span class="p">()</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_dates</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>        date  value  year  month  day day_name
0 2024-01-15    100  2024      1   15   Monday
1 2024-02-20    150  2024      2   20  Tuesday
2 2024-03-10    200  2024      3   10   Sunday
</code></pre>

</div>

<p><em>date add 10 days</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">]</span> <span class="o">+</span> <span class="n">pd</span><span class="p">.</span><span class="nc">Timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">10</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>0   2024-01-25
1   2024-03-01
2   2024-03-20
Name: date, dtype: datetime64[us]
</code></pre>

</div>

<p><em>date range 5 days</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">date_range</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">date_range</span><span class="p">(</span><span class="n">start</span><span class="o">=</span><span class="sh">'</span><span class="s">2024-01-01</span><span class="sh">'</span><span class="p">,</span> <span class="n">periods</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">freq</span><span class="o">=</span><span class="sh">'</span><span class="s">D</span><span class="sh">'</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">date_range</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03', '2024-01-04',
               '2024-01-05'],
              dtype='datetime64[us]', freq='D')
</code></pre>

</div>

<p><em>filter by date</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">start_date</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">to_datetime</span><span class="p">(</span><span class="sh">'</span><span class="s">2024-02-01</span><span class="sh">'</span><span class="p">)</span>
<span class="n">end_date</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nf">to_datetime</span><span class="p">(</span><span class="sh">'</span><span class="s">2024-03-01</span><span class="sh">'</span><span class="p">)</span>
<span class="n">df_filtered</span> <span class="o">=</span> <span class="n">df_dates</span><span class="p">[(</span><span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">start_date</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">df_dates</span><span class="p">[</span><span class="sh">'</span><span class="s">date</span><span class="sh">'</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">end_date</span><span class="p">)]</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_filtered</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>        date  value  year  month  day day_name
1 2024-02-20    150  2024      2   20  Tuesday
</code></pre>

</div>
<h3>
  
  
  Mathematical and statistical operations
</h3>

<p><em>sample dataframe</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_math</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">50</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">5</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">25</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">C</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">]</span>
<span class="p">})</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_math</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>    A   B  C
0  10   5  1
1  20  10  2
2  30  15  3
3  40  20  4
4  50  25  5
</code></pre>

</div>

<p><em>basic statistics</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Mean: </span><span class="si">{</span><span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">].</span><span class="nf">mean</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Median: </span><span class="si">{</span><span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">].</span><span class="nf">median</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Std Dev: </span><span class="si">{</span><span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">].</span><span class="nf">std</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Min: </span><span class="si">{</span><span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">].</span><span class="nf">min</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Max: </span><span class="si">{</span><span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">].</span><span class="nf">max</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Sum: </span><span class="si">{</span><span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">].</span><span class="nf">sum</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Mean: 30.0
Median: 30.0
Std Dev: 15.811388300841896
Min: 10
Max: 50
Sum: 150
</code></pre>

</div>

<p><em>percentiles</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">25th percentile: </span><span class="si">{</span><span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">].</span><span class="nf">quantile</span><span class="p">(</span><span class="mf">0.25</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">75th percentile: </span><span class="si">{</span><span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">].</span><span class="nf">quantile</span><span class="p">(</span><span class="mf">0.75</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>25th percentile: 20.0
75th percentile: 40.0
</code></pre>

</div>

<p><em>correlation</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_math</span><span class="p">.</span><span class="nf">corr</span><span class="p">())</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>     A    B    C
A  1.0  1.0  1.0
B  1.0  1.0  1.0
C  1.0  1.0  1.0
</code></pre>

</div>

<p><em>covariance</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_math</span><span class="p">.</span><span class="nf">cov</span><span class="p">())</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>       A      B     C
A  250.0  125.0  25.0
B  125.0   62.5  12.5
C   25.0   12.5   2.5
</code></pre>

</div>

<p><em>arithmetic operations</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A_add_B</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">]</span> <span class="o">+</span> <span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">]</span>
<span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A_subtract_B</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">]</span> <span class="o">-</span> <span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">]</span>
<span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A_squared</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">]</span> <span class="o">**</span> <span class="mi">2</span>

<span class="nf">print</span><span class="p">(</span><span class="n">df_math</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>    A   B  C  A_add_B  A_subtract_B  A_squared
0  10   5  1       15             5        100
1  20  10  2       30            10        400
2  30  15  3       45            15        900
3  40  20  4       60            20       1600
4  50  25  5       75            25       2500
</code></pre>

</div>

<p><em>apply numpy function</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">].</span><span class="nf">apply</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">sqrt</span><span class="p">))</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>0    3.162278
1    4.472136
2    5.477226
3    6.324555
4    7.071068
Name: A, dtype: float64
</code></pre>

</div>

<p><em>cumulative operations</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Cumulative sum of A:</span><span class="se">\n</span><span class="si">{</span><span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">].</span><span class="nf">cumsum</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Cumulative product of A:</span><span class="se">\n</span><span class="si">{</span><span class="n">df_math</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">].</span><span class="nf">cumprod</span><span class="p">()</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Cumulative sum of A:
0     10
1     30
2     60
3    100
4    150
Name: A, dtype: int64

Cumulative product of A:
0          10
1         200
2        6000
3      240000
4    12000000
Name: A, dtype: int64
</code></pre>

</div>
<h3>
  
  
  Useful tips and best practices
</h3>

<p><em>Create a copy to avoid accidental overwriting</em><br>
</p>
<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_copy</span> <span class="o">=</span> <span class="n">df</span><span class="p">.</span><span class="nf">copy</span><span class="p">()</span>
</code></pre>

</div>



<p><em>use inplace carefully</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_inplace</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]})</span>
<span class="n">df_inplace</span><span class="p">.</span><span class="nf">sort_values</span><span class="p">(</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">,</span> <span class="n">inplace</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</code></pre>

</div>



<p><em>Vectorised operations are generally faster than apply/loops</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="kn">import</span> <span class="n">time</span>
<span class="n">df_large</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">:</span> <span class="nf">range</span><span class="p">(</span><span class="mi">10000</span><span class="p">)})</span>

<span class="c1"># Slow: using apply
</span><span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="nf">time</span><span class="p">()</span>
<span class="n">result_slow</span> <span class="o">=</span> <span class="n">df_large</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">].</span><span class="nf">apply</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span>
<span class="n">time_slow</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="nf">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span>

<span class="c1"># Fast: vectorized
</span><span class="n">start</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="nf">time</span><span class="p">()</span>
<span class="n">result_fast</span> <span class="o">=</span> <span class="n">df_large</span><span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">]</span> <span class="o">*</span> <span class="mi">2</span>
<span class="n">time_fast</span> <span class="o">=</span> <span class="n">time</span><span class="p">.</span><span class="nf">time</span><span class="p">()</span> <span class="o">-</span> <span class="n">start</span>

<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">  Apply time: </span><span class="si">{</span><span class="n">time_slow</span><span class="si">:</span><span class="p">.</span><span class="mi">6</span><span class="n">f</span><span class="si">}</span><span class="s">s</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">  Vectorized time: </span><span class="si">{</span><span class="n">time_fast</span><span class="si">:</span><span class="p">.</span><span class="mi">6</span><span class="n">f</span><span class="si">}</span><span class="s">s</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>✓ Vectorized operations are faster
  Apply time: 0.010587s
  Vectorized time: 0.000676s
</code></pre>

</div>

<p><em>use groupby instead of loops</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_grouped</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span>
    <span class="sh">'</span><span class="s">group</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">value</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">]</span>
<span class="p">})</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">df_grouped</span><span class="p">.</span><span class="nf">groupby</span><span class="p">(</span><span class="sh">'</span><span class="s">group</span><span class="sh">'</span><span class="p">)[</span><span class="sh">'</span><span class="s">value</span><span class="sh">'</span><span class="p">].</span><span class="nf">sum</span><span class="p">()</span>

<span class="nf">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>✓ Use groupby for group operations (not loops)
group
A    3
B    7
Name: value, dtype: int64
</code></pre>

</div>

<p><em>For memory efficiency, categorical values may be preferable for repeated string data</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">df_mem</span> <span class="o">=</span> <span class="n">pd</span><span class="p">.</span><span class="nc">DataFrame</span><span class="p">({</span><span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">A</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">B</span><span class="sh">'</span><span class="p">]</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">})</span>

<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">✓ Use categorical for repeated string values</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">  Object dtype: </span><span class="si">{</span><span class="n">df_mem</span><span class="p">[</span><span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">].</span><span class="nf">memory_usage</span><span class="p">(</span><span class="n">deep</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span><span class="si">}</span><span class="s"> bytes</span><span class="sh">"</span><span class="p">)</span>

<span class="n">df_mem</span><span class="p">[</span><span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">df_mem</span><span class="p">[</span><span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">].</span><span class="nf">astype</span><span class="p">(</span><span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">  Categorical: </span><span class="si">{</span><span class="n">df_mem</span><span class="p">[</span><span class="sh">'</span><span class="s">category</span><span class="sh">'</span><span class="p">].</span><span class="nf">memory_usage</span><span class="p">(</span><span class="n">deep</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span><span class="si">}</span><span class="s"> bytes</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>✓ Use categorical for repeated string values
  Object dtype: 200132 bytes
  Categorical: 4232 bytes
</code></pre>

</div>

<p><em>chaining operations</em><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">result</span> <span class="o">=</span> <span class="p">(</span><span class="n">df</span>
  <span class="p">.</span><span class="nf">query</span><span class="p">(</span><span class="sh">'</span><span class="s">age &gt; 25</span><span class="sh">'</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">copy</span><span class="p">()</span>
  <span class="p">.</span><span class="nf">assign</span><span class="p">(</span><span class="n">age_group</span><span class="o">=</span><span class="sh">'</span><span class="s">Senior</span><span class="sh">'</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">sort_values</span><span class="p">(</span><span class="sh">'</span><span class="s">age</span><span class="sh">'</span><span class="p">,</span> <span class="n">ascending</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">result</span><span class="p">)</span>
</code></pre>

</div>




<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>      name  age     city age_group<br>
2  Charlie   35  Chicago    Senior<br>
1      Bob   30       LA    Senior<br>
</code></pre>

</div>
<h2>
<br>
  <br>
  <br>
  Conclusion<br>
</h2>

<p>Pandas is one of the most practical and widely used libraries for data analysis in Python. This tutorial has introduced the core ideas behind creating and inspecting DataFrames, selecting and filtering data, cleaning missing values, grouping observations, and combining datasets from different sources.</p>

<p>A major strength of Pandas lies in its ability to make data manipulation both readable and efficient. With a small set of intuitive methods, it becomes straightforward to transform raw data into a structure suitable for exploration, reporting, or further analysis. These capabilities are especially valuable in real-world workflows where datasets are often messy, incomplete, or spread across multiple files.</p>

<p>To build confidence with Pandas, regular practice is essential. Readers are encouraged to experiment with the methods shown here on their own datasets, compare different approaches for the same task, and gradually explore more advanced features such as time-series handling, custom aggregations, and multi-index operations. In this way, the foundations introduced in this article can grow into a deeper and more flexible understanding of data analysis in Python.</p>

<p>Did this article help you? Let me know in the comments below, and don’t forget to drop a like if you enjoyed the read! Thank you.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Erstmals laufen 46 Prozent der Firmen-Workloads außer Haus]]></title>
<description><![CDATA[Externe Rechenzentren sind erstmals beliebter als unternehmenseigene Anlagen.
Gorodenkoff – shutterstock.com



Unternehmen verlagern einen zunehmend größeren Anteil ihrer IT-Workloads auf Colocation– und Cloud-Anbieter, firmeneigene Rechenzentren haben das Nachsehen. Wie dem aktuellen „Global Da...]]></description>
<link>https://tsecurity.de/de/3702508/it-security-nachrichten/erstmals-laufen-46-prozent-der-firmen-workloads-ausser-haus/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3702508/it-security-nachrichten/erstmals-laufen-46-prozent-der-firmen-workloads-ausser-haus/</guid>
<pubDate>Tue, 04 Aug 2026 09:32:40 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure class="wp-block-image size-large"><img loading="lazy" src="https://b2b-contenthub.com/wp-content/uploads/2026/08/3D-Grafikkonzept-Big-Data-Center-Chief-Technology-Officer-mit-Laptop-in-der-Lagerhalle.jpg?quality=50&amp;strip=all&amp;w=1024" alt="3D-Grafikkonzept: Big Data Center Chief Technology Officer mit Laptop in der Lagerhalle, aktiviert Server, Information Digitalisierung beginnt. SAAS, Cloud Computing, Webdienst" class="wp-image-4204520" width="1024" height="576" sizes="auto, (max-width: 1024px) 100vw, 1024px"><figcaption class="wp-element-caption"><p>Externe Rechenzentren sind erstmals beliebter als unternehmenseigene Anlagen.</p>
</figcaption></figure><p class="imageCredit">Gorodenkoff – shutterstock.com</p></div>



<p class="wp-block-paragraph">Unternehmen verlagern einen zunehmend größeren Anteil ihrer IT-Workloads auf <a href="https://tsecurity.de/weiterlesen/3674365/3702508/erstmals-laufen-46-prozent-der-firmen-workloads-ausser-haus/" target="_blank" rel="noopener noreferrer">Colocation</a>– und Cloud-Anbieter, firmeneigene <a href="https://tsecurity.de/weiterlesen/3674365/3702508/erstmals-laufen-46-prozent-der-firmen-workloads-ausser-haus/" target="_blank" rel="noopener noreferrer">Rechenzentren</a> haben das Nachsehen. Wie dem aktuellen „<a href="https://tsecurity.de/weiterlesen/3674365/3702508/erstmals-laufen-46-prozent-der-firmen-workloads-ausser-haus/" target="_blank" rel="noopener noreferrer">Global Data Center Survey</a>“ des Uptime Institute (Download gegen Daten) zu entnehmen ist, machen externe Rechenzentrumseinrichtungen und -dienste in diesem Jahr 2026 einen Anteil von 46 Prozent an den IT-Workloads aus. Damit liegen sie – Dienste von Colocation-, Cloud-, Hosting- und SaaS-Anbietern eingeschlossen – knapp über den 44 Prozent, die auf unternehmenseigene Rechenzentren entfallen.</p>



<p class="wp-block-paragraph">Wie die Experten betonen, ist dies das erste Mal seit Erhebung der Studie, dass externe Rechenzentrumsstandorte einen größeren Anteil an den IT-Workloads von Unternehmen halten als unternehmenseigene Einrichtungen. Im Rahmen der Studie befragte Uptime zwischen April und Mai 2026 mehr als 1.600 Teilnehmern weltweit, darunter über 800 Rechenzentrumsbetreiber und -eigentümer.</p>



<h2 class="wp-block-heading">On-Premises verliert an Boden, aber nicht an Relevanz</h2>



<p class="wp-block-paragraph">Die Experten gehen davon aus, dass sich der Abstand bis 2028 auf 48 Prozent vergrößern wird. Dennoch werden unternehmenseigene Rechenzentren laut Uptime weiterhin ein wesentlicher Bestandteil hybrider IT-Strategien bleiben, da viele Workloads wegen Sicherheits- und regulatorischen Anforderungen weiterhin On-Premises betrieben werden müssen.</p>



<p class="wp-block-paragraph">„All diese Faktoren hängen miteinander zusammen – und zwar durch KI“, erklärt <a href="https://tsecurity.de/weiterlesen/3674365/3702508/erstmals-laufen-46-prozent-der-firmen-workloads-ausser-haus/" target="_blank" rel="noopener noreferrer">Andy Lawrence</a>, Executive Director of Research bei Uptime. „Der Druck auf die gesamte Lieferkette, die Kostenstruktur, die Stromverfügbarkeit – all das wird durch den massiven Nachfrageschub nach KI-Infrastruktur vorangetrieben.“</p>



<h2 class="wp-block-heading">Kostendruck bleibt hoch – auch wegen KI</h2>



<p class="wp-block-paragraph">Zugleich steht das Thema Kosten für die Betreiber auch das vierte Jahr in Folge an erster Stelle: 79 Prozent der Befragten gaben an, dass ihr Management zumindest in gewissem Maße besorgt über die Kostenentwicklung sei. Der Anteil derjenigen mit einer „sehr besorgten“ Führungsebene sank jedoch von 44 Prozent im Vorjahr auf 38 Prozent.</p>



<p class="wp-block-paragraph">Die Ergebnisse deuten darauf hin, dass die Betreiber Kosten inzwischen gegen ein breiteres Spektrum an KI-bezogenen Herausforderungen abwägen müssen. 76 Prozent sorgen sich hinsichtlich der Prognose künftiger Kapazitätsanforderungen. Außerdem zählten Unterbrechungen in der Lieferkette, Personalmangel, die Verfügbarkeit von Strom sowie die Bereitstellung geeigneter KI-Infrastruktur zu den Hauptsorgen des Managements.</p>



<p class="wp-block-paragraph">„Die Bedenken hinsichtlich der Kosten sind zwar etwas zurückgegangen, doch das bedeutet nicht, dass diese keine Rolle mehr spielen“, erläutert Lawrence. „Es heißt lediglich, dass andere Aspekte an Bedeutung gewonnen haben.“</p>



<h2 class="wp-block-heading">RZ-Betreiber werden vorsichtiger im Umgang mit KI</h2>



<p class="wp-block-paragraph">Während die Anwenderunternehmen mittlerweile nicht mehr nur mit generativer KI experimentieren, scheinen die Verantwortlichen in den Rechenzentren nun sorgfältiger abzuwägen, wo die Technologie sicher eingesetzt werden kann. So sank der Anteil der Befragten, die der Ansicht sind, dass KI die Effizienz von Anlagen steigert, von 58 Prozent im Vorjahr auf 52 Prozent.</p>



<p class="wp-block-paragraph">Das Vertrauen darin, dass KI menschliche Fehler reduziert, sank sogar um elf Prozentpunkte auf 40 Prozent. Am größten ist das Vertrauen nach wie vor bei Anwendungen mit geringerem Risiko, etwa bei der Betriebsanalyse und der vorausschauenden Wartung (Predictive Maintenance). Nur 31 Prozent trauen dagegen der KI die Steuerung von Geräteeinstellungen zu, lediglich 16 Prozent automatisierte Konfigurationsänderungen.</p>



<p class="wp-block-paragraph">„Dieser Vertrauensrückgang deutet darauf hin, dass viele Betreiber noch weit davon entfernt sind, umfangreiche Steuerungsaufgaben der KI zu überlassen“, erläutert <a href="https://tsecurity.de/weiterlesen/3674365/3702508/erstmals-laufen-46-prozent-der-firmen-workloads-ausser-haus/" target="_blank" rel="noopener noreferrer">Jacquie Davis</a>, Research Analyst bei Uptime. „Dies unterstreicht, wie wichtig es ist, den Menschen in den Prozess einzubeziehen.“</p>



<h2 class="wp-block-heading">KI treibt Rack-Dichte in die Höhe</h2>



<p class="wp-block-paragraph">Der Einsatz von KI beginnt zudem, das Design der Infrastruktur zu verändern: Die durchschnittliche modale Rack-Dichte überschritt erstmals die Marke von elf Kilowatt (kW), ein Meilenstein wie die Experten bemerken. Ausschlaggebend dafür sei maßgeblich die wachsende Zahl von KI-Rechenzentren mit typischen Rack-Dichten von über 30 kW, hieß es.</p>



<p class="wp-block-paragraph">Ohne diese Installationen fällt der Anstieg der Rack-Dichte mit einem Zuwachs von 7,5 kW auf 7,8 kW moderater aus. Mittlerweile gibt fast ein Viertel der Betreiber an, über mindestens einige Racks mit einer Leistung von mehr als 30 kW zu verfügen. Vor einem Jahr lag dieser Anteil noch bei 19 Prozent. <a href="https://tsecurity.de/weiterlesen/3674365/3702508/erstmals-laufen-46-prozent-der-firmen-workloads-ausser-haus/" target="_blank" rel="noopener noreferrer">Daniel Bizo</a>, Forschungsleiter bei Uptime, bezeichnet das Überschreiten der 11-kW-Marke als „psychologischen Meilenstein“ für die Branche. Der Modalwert spiegele nun den wachsenden Einfluss von KI-orientierten Implementierungen wider.</p>



<p class="wp-block-paragraph"><a href="https://tsecurity.de/weiterlesen/3674365/3702508/erstmals-laufen-46-prozent-der-firmen-workloads-ausser-haus/" target="_blank" rel="noopener noreferrer">Chris Brown</a>, Chief Technology Officer (CTO) von Uptime, erklärt, dass vor allem KI-Trainingslasten die höchsten Rack-Dichten verursachten. Bei Rechenzentren unterhalb der 30-kW-Grenze stellen weiterhin eher traditionelle Unternehmensanwendungen den Haupttreiber dar. „KI treibt die Rack-Dichte schneller in die Höhe als jeder andere Faktor“, so Brown. Gleichzeitig seien klassische Enterprise-Anwendungen weiterhin der dominierende Faktor für die meisten Rechenzentren unterhalb der extrem hohen KI-Leistungsdichten.</p>



<h2 class="wp-block-heading">Ausfälle werden seltener, aber kostspieliger</h2>



<p class="wp-block-paragraph">Zum sechsten Mal in Folge ging die Anzahl der Betreiber zurück, die in den vergangenen drei Jahren einen folgenschweren Ausfall erlebt haben: 47 Prozent berichteten von so einem Vorfall, verglichen mit 50 Prozent im Vorjahr. Die finanziellen Folgen nehmen jedoch zu: 71 Prozent der Betreiber, die einen Ausfall erlebten, gaben an, dass ihr schwerwiegendster Vorfall Kosten von mindestens 100.000 Dollar verursachte. Im Vorjahr waren es noch 57 Prozent.</p>



<p class="wp-block-paragraph">Mit 56 Prozent bleiben Stromausfälle dabei weiterhin die Hauptursache für folgenschwere Störungen Brown erwartet jedoch, dass Ausfälle im Zusammenhang mit der Kühlung an Bedeutung gewinnen, da die Leistungsdichte in den Racks KI bedingt weiter zunimmt.</p>



<h2 class="wp-block-heading">Nachhaltigkeit gewinnt wieder an Dynamik</h2>



<p class="wp-block-paragraph">Nachdem die Entwicklung im vergangenen Jahr stagnierte, verzeichnet das Nachhaltigkeits-Reporting nun wieder einen leichten Aufwärtstrend. So erfasst inzwischen mehr als die Hälfte der Betreiber den Wasserverbrauch – ein Anstieg gegenüber 47 Prozent im Vorjahr. Laut Lawrence war die vorübergehende Verlangsamung vor allem auf den starken Fokus der Branche auf den Ausbau von KI-Kapazitäten zurückzuführen – und nicht etwa eine Abkehr von Nachhaltigkeitszielen.</p>



<h2 class="wp-block-heading">Personalmangel verschärft sich</h2>



<p class="wp-block-paragraph">Der Fachkräftemangel in der Branche hat sich dagegen nach einigen Jahren relativer Stabilität verschärft: Mehr als die Hälfte der Befragten gab an, Schwierigkeiten bei der Suche nach qualifizierten Fachkräften zu haben – ein Anstieg gegenüber 46 Prozent im Vorjahr. Zudem berichteten 28 Prozent, Mitarbeitende an konkurrierende Rechenzentrumsbetreiber verloren zu haben.</p>



<p class="wp-block-paragraph">Am schwierigsten zu besetzen sind den Befragten zufolge Stellen für Elektrofachkräfte und sowie Mitarbeitende für den operativen Betrieb auf Einstiegsniveau. Dies spiegle den wachsenden Bedarf an Fachwissen im Bereich KI-bezogener Infrastruktur wider, so die Experten. (tf)</p>



<p class="wp-block-paragraph"><em>Dieser Artikel ist im <a href="https://tsecurity.de/weiterlesen/3674365/3702508/erstmals-laufen-46-prozent-der-firmen-workloads-ausser-haus/" target="_blank" rel="noopener noreferrer">Original</a> bei unserer Schwesterpublikation Networkworld.com erschienen.</em></p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Designing a Backend System That Handles 100K Requests/Second (Without Melting Your Database)]]></title>
<description><![CDATA[TL;DR Architecture


At high level:



Global Traffic Routing (Geo DNS / Anycast)

Edge Layer (CDN + WAF + Rate Limiting)

Load Balancers (L4 + L7)

Stateless App Tier (autoscaled microservices)

Multi layer Caching (edge, distributed, local)

Data Layer (sharded DB + replicas + queue based write...]]></description>
<link>https://tsecurity.de/de/3701981/sichere-programmierung/designing-a-backend-system-that-handles-100k-requestssecond-without-melting-your-database/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3701981/sichere-programmierung/designing-a-backend-system-that-handles-100k-requestssecond-without-melting-your-database/</guid>
<pubDate>Tue, 04 Aug 2026 02:18:40 +0200</pubDate>
<content:encoded><![CDATA[<h2>
  
  
  TL;DR Architecture
</h2>

<p>At high level:</p>

<ol>
<li>
<strong>Global Traffic Routing</strong> (Geo DNS / Anycast)</li>
<li>
<strong>Edge Layer</strong> (CDN + WAF + Rate Limiting)</li>
<li>
<strong>Load Balancers</strong> (L4 + L7)</li>
<li>
<strong>Stateless App Tier</strong> (autoscaled microservices)</li>
<li>
<strong>Multi layer Caching</strong> (edge, distributed, local)</li>
<li>
<strong>Data Layer</strong> (sharded DB + replicas + queue based writes)</li>
<li>
<strong>Async Processing</strong> (Kafka / stream workers)</li>
<li><strong>Observability + Auto healing</strong></li>
</ol>




<h2>
  
  
  1) Capacity Planning First (Quick Math)
</h2>

<p>Never start with boxes and arrows. Start with numbers.</p>

<p>Assume:</p>

<ul>
<li><strong>100K RPS peak</strong></li>
<li>95th percentile response target: <strong>&lt; 150ms</strong>
</li>
<li>Read heavy workload: <strong>90% reads</strong>, <strong>10% writes</strong>
</li>
<li>Payload average: <strong>2KB response</strong>
</li>
<li>Peak egress = <code>100,000 * 2KB = ~200MB/s</code> (~1.6 Gbps, ignoring overhead)</li>
</ul>

<p>Now read/write split:</p>

<ul>
<li>Reads: <strong>90K RPS</strong>
</li>
<li>Writes: <strong>10K RPS</strong>
</li>
</ul>

<p>Without caching, DB is dead.<br><br>
So design target: <strong>serve 80–95% reads from cache</strong>.</p>

<p>If 90K reads and 90% cache hit:</p>

<ul>
<li>DB reads drop to <strong>9K RPS</strong> (huge difference)</li>
</ul>




<h2>
  
  
  2) Request Flow (End-to-End)
</h2>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Client
  ↓
Geo DNS / Anycast
  ↓
CDN + WAF + DDoS Protection
  ↓
L4 Load Balancer (TCP/connection distribution)
  ↓
L7 Load Balancer / API Gateway (routing, auth, throttling)
  ↓
Stateless Service Pods (Kubernetes / ECS)
  ↓
Cache Layer (Redis Cluster + local in memory cache)
  ↓
Database Layer (primary + read replicas + shards)
  ↓
Event Bus (Kafka/Pulsar) for async writes and side effects
</code></pre>

</div>






<h2>
  
  
  3) Load Balancing Strategy (100K RPS Safe)
</h2>

<h3>
  
  
  L4 + L7 combo
</h3>

<ul>
<li>
<strong>L4 LB</strong> handles raw connection distribution efficiently.</li>
<li>
<strong>L7 LB/API Gateway</strong> handles:

<ul>
<li>path based routing</li>
<li>JWT/auth checks</li>
<li>per client rate limits</li>
<li>request shaping</li>
</ul>
</li>
</ul>

<h3>
  
  
  Algorithms
</h3>

<ul>
<li>Use <strong>least request</strong> or <strong>EWMA latency based routing</strong> over round robin.</li>
<li>Enable <strong>slow start</strong> for new pods (avoid sending full traffic instantly).</li>
<li>Circuit break unhealthy nodes quickly with active health checks.</li>
</ul>

<h3>
  
  
  Multi region failover
</h3>

<ul>
<li>Active in at least 2 regions for true HA.</li>
<li>Traffic policy:

<ul>
<li>nearest region by latency</li>
<li>fail to secondary if SLA drops</li>
</ul>
</li>
</ul>




<h2>
  
  
  4) Caching: Your Main Weapon Against DB Overload
</h2>

<p>At 100K RPS, caching is not optional.</p>

<h2>
  
  
  Multi layer cache design
</h2>

<ol>
<li>
<strong>CDN Cache</strong> (public GET responses, static + semi dynamic)</li>
<li>
<strong>Service side Distributed Cache</strong> (Redis Cluster)</li>
<li>
<strong>In process Local Cache</strong> (hot keys, tiny TTL)</li>
</ol>

<h3>
  
  
  Recommended pattern
</h3>

<ul>
<li>
<strong>Cache aside</strong> for most reads.</li>
<li>Key format namespaced:

<ul>
<li><code>user:v3:12345:profile</code></li>
</ul>
</li>
<li>TTL with jitter:

<ul>
<li>e.g. 120s ± random(0–30s)</li>
<li>prevents thundering herd at exact expiration moment.</li>
</ul>
</li>
</ul>

<h3>
  
  
  Prevent cache stampede
</h3>

<p>Use:</p>

<ul>
<li>Request coalescing (single flight per key)</li>
<li>Soft TTL + background refresh</li>
<li>Distributed lock for ultra hot keys</li>
</ul>

<h3>
  
  
  Hot key protection
</h3>

<p>If one key gets massive traffic:</p>

<ul>
<li>Replicate hot key across multiple Redis slots</li>
<li>Or keep a near cache in every app instance</li>
<li>Add tiny randomized response delays for abusive clients</li>
</ul>




<h2>
  
  
  5) Database Design Under High Load
</h2>

<h2>
  
  
  Primary principles
</h2>

<ul>
<li>Keep app tier stateless, keep DB tier protected.</li>
<li>Reads should mostly hit cache or read replicas.</li>
<li>Writes should be controlled and often asynchronous where possible.</li>
</ul>

<h2>
  
  
  Read scaling
</h2>

<ul>
<li>Primary + N read replicas</li>
<li>Route stale tolerant reads to replicas</li>
<li>Use follower reads with max replication lag guard (e.g. &lt; 200ms)</li>
</ul>

<h2>
  
  
  Write scaling
</h2>

<p>For 10K writes/sec:</p>

<ul>
<li>Partition by tenant/user/hash key</li>
<li>Use <strong>sharding</strong> for horizontal scaling</li>
<li>Avoid cross shard joins in hot paths</li>
</ul>

<h2>
  
  
  Index strategy
</h2>

<ul>
<li>Index only what query patterns demand</li>
<li>Watch write amplification from too many indexes</li>
<li>Add covering indexes for hottest reads</li>
</ul>

<h2>
  
  
  Connection management
</h2>

<ul>
<li>Use DB proxy/pooler (PgBouncer, RDS Proxy, etc.)</li>
<li>Enforce max connections per service</li>
<li>Backpressure before DB collapse</li>
</ul>




<h2>
  
  
  6) Async Architecture for Spikes
</h2>

<p>Not every request must complete all work synchronously.</p>

<p>Use an event stream (Kafka/Pulsar):</p>

<ul>
<li>API writes critical data quickly</li>
<li>Emits event</li>
<li>Background workers process:

<ul>
<li>emails</li>
<li>analytics</li>
<li>notifications</li>
<li>search indexing</li>
<li>cache warming</li>
</ul>
</li>
</ul>

<p>This decouples user latency from heavy downstream work.</p>

<h3>
  
  
  Queue safety patterns
</h3>

<ul>
<li>Idempotency keys</li>
<li>Retry with exponential backoff</li>
<li>Dead letter queues (DLQ)</li>
<li>Exactly once is hard; prefer effectively once with dedupe</li>
</ul>




<h2>
  
  
  7) Failure Handling &amp; Resilience
</h2>

<p>At 100K RPS, partial failures are normal.</p>

<p>Must have patterns:</p>

<ul>
<li>
<strong>Timeouts everywhere</strong> (client, service, DB, cache)</li>
<li>
<strong>Circuit breakers</strong> to isolate failures</li>
<li>
<strong>Bulkheads</strong> to isolate resource pools</li>
<li>
<strong>Rate limiting</strong> (per IP/token/tenant)</li>
<li>
<strong>Load shedding</strong> for non critical traffic</li>
<li>
<strong>Graceful degradation</strong> (return partial response instead of 500)</li>
</ul>

<p>Example degradation:</p>

<ul>
<li>Personalized recommendations fail → show trending defaults from cache.</li>
</ul>




<h2>
  
  
  8) Observability (If You Can’t See It, You Can’t Scale It)
</h2>

<p>Track these golden signals per service:</p>

<ul>
<li>Latency (p50/p95/p99)</li>
<li>Traffic (RPS)</li>
<li>Errors (4xx/5xx)</li>
<li>Saturation (CPU, memory, queue depth, DB connections)</li>
</ul>

<p>Also monitor:</p>

<ul>
<li>Cache hit ratio (global + per endpoint)</li>
<li>Redis latency + evictions</li>
<li>DB replica lag</li>
<li>Kafka consumer lag</li>
<li>LB healthy target count</li>
</ul>

<p>Use distributed tracing (OpenTelemetry) for cross service bottlenecks.</p>




<h2>
  
  
  9) Security &amp; Abuse Controls at Scale
</h2>

<p>High traffic attracts abuse.</p>

<p>Add:</p>

<ul>
<li>WAF managed rules</li>
<li>Bot detection and challenge</li>
<li>API keys/JWT scopes</li>
<li>Per consumer quota tiers</li>
<li>Payload size limits</li>
<li>Schema validation at gateway</li>
</ul>

<p>For sensitive operations:</p>

<ul>
<li>Idempotency tokens</li>
<li>Signed requests</li>
<li>Replay protection (nonce + timestamp)</li>
</ul>




<h2>
  
  
  10) Cost Aware Scaling
</h2>

<p>100K RPS can become very expensive very quickly.</p>

<p>Cost controls:</p>

<ul>
<li>Push cache hit ratio upward (biggest saver)</li>
<li>Use autoscaling with smart cooldowns</li>
<li>Rightsize pods and DB nodes continuously</li>
<li>Use spot/preemptible nodes for stateless workers</li>
<li>Tiered storage for old data</li>
<li>Archive cold analytics out of primary DB</li>
</ul>




<h2>
  
  
  11) Example Technology Stack (Reference)
</h2>

<ul>
<li>
<strong>Edge</strong>: Cloudflare / Fastly / Akamai</li>
<li>
<strong>LB/API</strong>: NGINX / Envoy / AWS ALB + API Gateway</li>
<li>
<strong>App</strong>: Go / Rust / Java (stateless containers)</li>
<li>
<strong>Cache</strong>: Redis Cluster (+ local LRU cache)</li>
<li>
<strong>DB</strong>: Postgres sharded / MySQL Vitess / Cassandra (depends on access patterns)</li>
<li>
<strong>Stream</strong>: Kafka</li>
<li>
<strong>Orchestration</strong>: Kubernetes</li>
<li>
<strong>Observability</strong>: Prometheus + Grafana + OpenTelemetry + Tempo/Jaeger</li>
</ul>




<h2>
  
  
  12) “Surprise Me” Section: Make It Sexy ✨
</h2>

<p>Here are advanced touches that make this architecture stand out:</p>

<h3>
  
  
  A) Adaptive TTL Cache
</h3>

<p>Instead of fixed TTL, auto tune TTL based on key popularity + update frequency:</p>

<ul>
<li>hot and stable keys =&gt; longer TTL</li>
<li>volatile keys =&gt; shorter TTL
Result: higher hit ratio without stale data explosion.</li>
</ul>

<h3>
  
  
  B) Predictive Cache Warming
</h3>

<p>Use yesterday’s traffic patterns + upcoming events to pre warm top keys before peak hours.</p>

<h3>
  
  
  C) Brownout Mode
</h3>

<p>When system stress is high, automatically disable non essential features:</p>

<ul>
<li>hide expensive widgets</li>
<li>skip deep personalization</li>
<li>defer non critical writes
Users still get core functionality fast.</li>
</ul>

<h3>
  
  
  D) Cell Based Architecture
</h3>

<p>Split platform into isolated “cells” (mini stacks with their own app/cache/db shards).<br><br>
If one cell fails, blast radius stays contained.</p>




<h2>
  
  
  13) Minimal Launch Plan (Practical Roadmap)
</h2>

<h3>
  
  
  Phase 1 (up to ~10K RPS)
</h3>

<ul>
<li>Single region</li>
<li>L7 LB + autoscaled stateless services</li>
<li>Redis + primary DB + replicas</li>
<li>Basic metrics + alerts</li>
</ul>

<h3>
  
  
  Phase 2 (~10K to 50K RPS)
</h3>

<ul>
<li>Add CDN caching</li>
<li>Add queue/event driven async workers</li>
<li>Read/write splitting, stronger rate limits</li>
<li>Better tracing and SLOs</li>
</ul>

<h3>
  
  
  Phase 3 (~50K to 100K+ RPS)
</h3>

<ul>
<li>Multi region active</li>
<li>DB sharding + cell architecture</li>
<li>Advanced cache protections</li>
<li>Brownout + load shedding automation</li>
<li>Game day chaos testing</li>
</ul>




<h2>
  
  
  Final Takeaway
</h2>

<p>At <strong>100K RPS</strong>, success is less about one “super database” and more about <strong>traffic shaping + caching + graceful degradation</strong>.</p>

<p>If you remember one formula, make it this:</p>

<blockquote>
<p><strong>Scale reads with caches, scale writes with partitioning + async workflows, protect everything with backpressure.</strong></p>
</blockquote>

<p>That is how you survive high load without burning your database—or your team.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[VCF Breakroom Chats Episode 92: Simplifying VCF 9.1 Install and Brownfield Import]]></title>
<description><![CDATA[In Episode 92 of VCF Breakroom Chats, Puneet Chawla (Product Management, Broadcom) joins Sehjung Hah (Product Marketing Engineer, Broadcom) to discuss the install and import enhancements in VMware Cloud Foundation (VCF) 9.1. Learn how VCF 9.1 streamlines the path to a private cloud, whether you a...]]></description>
<link>https://tsecurity.de/de/3701490/it-security-downloads/vcf-breakroom-chats-episode-92-simplifying-vcf-91-install-and-brownfield-import/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3701490/it-security-downloads/vcf-breakroom-chats-episode-92-simplifying-vcf-91-install-and-brownfield-import/</guid>
<pubDate>Mon, 03 Aug 2026 20:21:33 +0200</pubDate>
<content:encoded><![CDATA[<div><img width="300" height="169" src="https://blogs.vmware.com/cloud-foundation/wp-content/uploads/sites/75/2025/12/VCF-Breakroom-Chats-Final-Selected-featured-image.png?w=300" class="attachment-medium size-medium wp-post-image" alt="" decoding="async" fetchpriority="high" srcset="https://blogs.vmware.com/cloud-foundation/wp-content/uploads/sites/75/2025/12/VCF-Breakroom-Chats-Final-Selected-featured-image.png 1920w, https://blogs.vmware.com/cloud-foundation/wp-content/uploads/sites/75/2025/12/VCF-Breakroom-Chats-Final-Selected-featured-image.png?resize=300,169 300w, https://blogs.vmware.com/cloud-foundation/wp-content/uploads/sites/75/2025/12/VCF-Breakroom-Chats-Final-Selected-featured-image.png?resize=768,432 768w, https://blogs.vmware.com/cloud-foundation/wp-content/uploads/sites/75/2025/12/VCF-Breakroom-Chats-Final-Selected-featured-image.png?resize=1024,577 1024w, https://blogs.vmware.com/cloud-foundation/wp-content/uploads/sites/75/2025/12/VCF-Breakroom-Chats-Final-Selected-featured-image.png?resize=1536,865 1536w, https://blogs.vmware.com/cloud-foundation/wp-content/uploads/sites/75/2025/12/VCF-Breakroom-Chats-Final-Selected-featured-image.png?resize=752,423 752w, https://blogs.vmware.com/cloud-foundation/wp-content/uploads/sites/75/2025/12/VCF-Breakroom-Chats-Final-Selected-featured-image.png?resize=576,324 576w, https://blogs.vmware.com/cloud-foundation/wp-content/uploads/sites/75/2025/12/VCF-Breakroom-Chats-Final-Selected-featured-image.png?resize=600,338 600w" sizes="(max-width: 300px) 100vw, 300px"></div>
<p>In Episode 92 of VCF Breakroom Chats, Puneet Chawla (Product Management, Broadcom) joins Sehjung Hah (Product Marketing Engineer, Broadcom) to discuss the install and import enhancements in VMware Cloud Foundation (VCF) 9.1. Learn how VCF 9.1 streamlines the path to a private cloud, whether you are building a new environment or bringing existing infrastructure into … <a href="https://tsecurity.de/weiterlesen/3673348/3701490/vcf-breakroom-chats-episode-92-simplifying-vcf-91-install-and-brownfield-import/" target="_blank" rel="noopener noreferrer">Continued</a></p>
<p>The post <a href="https://tsecurity.de/weiterlesen/3673348/3701490/vcf-breakroom-chats-episode-92-simplifying-vcf-91-install-and-brownfield-import/" target="_blank" rel="noopener noreferrer">VCF Breakroom Chats Episode 92: Simplifying VCF 9.1 Install and Brownfield Import</a> appeared first on <a href="https://tsecurity.de/weiterlesen/3673348/3701490/vcf-breakroom-chats-episode-92-simplifying-vcf-91-install-and-brownfield-import/" target="_blank" rel="noopener noreferrer">VMware Cloud Foundation (VCF) Blog</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Khachapuri: Georgian Cheese Bread in Pure CSS]]></title>
<description><![CDATA[This is a submission for Frontend Challenge - Comfort Food Edition, CSS Art.


  
  
  Inspiration


When I think about comfort food, the first dish that comes to my mind is Imeretian Khachapuri (იმერული ხაჭაპური). It's a traditional cheese bread from the Imereti region in western Georgia. It has...]]></description>
<link>https://tsecurity.de/de/3700730/sichere-programmierung/khachapuri-georgian-cheese-bread-in-pure-css/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3700730/sichere-programmierung/khachapuri-georgian-cheese-bread-in-pure-css/</guid>
<pubDate>Mon, 03 Aug 2026 12:57:48 +0200</pubDate>
<content:encoded><![CDATA[<p><em>This is a submission for <a href="https://tsecurity.de/weiterlesen/3672589/3700730/khachapuri-georgian-cheese-bread-in-pure-css/" target="_blank" rel="noopener noreferrer">Frontend Challenge - Comfort Food Edition, CSS Art</a>.</em></p>

<h2>
  
  
  Inspiration
</h2>

<p>When I think about comfort food, the first dish that comes to my mind is Imeretian Khachapuri (იმერული ხაჭაპური). It's a traditional cheese bread from the Imereti region in western Georgia. It has soft yeast dough with melted Imeruli cheese inside, baked until golden brown and brushed with butter after baking. Unlike pizza, the cheese is completely inside the dough. For me, khachapuri is more than food; it's warmth, home, and childhood memories. I wanted to recreate this fresh, steaming bread using only HTML and CSS.</p>

<h2>
  
  
  Demo
</h2>

<p>

</p>

<h2>
  
  
  Journey
</h2>

<h3>
  
  
  1. Pure CSS
</h3>

<p>Every visible part, from the bread texture to the steam and slicing animation, is made only with HTML and CSS.No images, SVG, canvas, or JavaScript.</p>

<h3>
  
  
  2. Slicing the Circle with clip-path Math
</h3>

<p>Instead of creating one full loaf and hiding it with overlays, I divided it into 13 slices, using <code>clip-path: polygon()</code>. Thirteen slices were enough to make the bread disappear smoothly without adding too many HTML elements.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight css"><code><span class="nc">.khachapuri-slice</span><span class="nd">:nth-of-type</span><span class="o">(</span><span class="err">1</span><span class="o">)</span> <span class="p">{</span> 
<span class="nl">clip-path</span><span class="p">:</span> <span class="n">polygon</span><span class="p">(</span><span class="m">50%</span> <span class="m">50%</span><span class="p">,</span> <span class="m">38.01%</span> <span class="m">1.46%</span><span class="p">,</span> <span class="m">61.99%</span> <span class="m">1.46%</span><span class="p">);</span>
<span class="nl">animation</span><span class="p">:</span> <span class="n">slice-cut-1</span> <span class="m">20s</span> <span class="n">linear</span> <span class="n">infinite</span><span class="p">;</span> 
<span class="p">}</span>
</code></pre>

</div>



<p>Each slice uses the same gradient layers, so together they look like one seamless loaf until the animation starts.</p>

<h3>
  
  
  3. Layering the Oven-Baked Sheen
</h3>

<p>To recreate the look of freshly baked bread, I layered several radial gradients to create:</p>

<ul>
<li>Darker baked spots (<code>rgba(135,65,20,.55)</code>)</li>
<li>Toasted golden areas (<code>#efb33d</code>)</li>
<li>A glossy highlight (<code>rgba(255,245,170,.55)</code>) to simulate fresh butter brushed over hot dough.</li>
</ul>

<h3>
  
  
  4. Magazine Layout with shape-outside
</h3>

<p>To make the layout feel more like a food blog, I wrapped the text around the plate using CSS shapes:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight css"><code><span class="nc">.khachapuri-frame</span> <span class="p">{</span>
  <span class="nl">float</span><span class="p">:</span> <span class="nb">left</span><span class="p">;</span>
  <span class="py">shape-outside</span><span class="p">:</span> <span class="nb">circle</span><span class="p">(</span><span class="m">48%</span><span class="p">);</span>
  <span class="nl">width</span><span class="p">:</span> <span class="n">clamp</span><span class="p">(</span><span class="m">180px</span><span class="p">,</span> <span class="m">24vw</span><span class="p">,</span> <span class="m">320px</span><span class="p">);</span>
  <span class="nl">height</span><span class="p">:</span> <span class="n">clamp</span><span class="p">(</span><span class="m">180px</span><span class="p">,</span> <span class="m">24vw</span><span class="p">,</span> <span class="m">320px</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>

</div>



<h3>
  
  
  5. Accessibility &amp; Polish
</h3>

<p>The slice animations respect <a href="https://tsecurity.de/weiterlesen/3672589/3700730/khachapuri-georgian-cheese-bread-in-pure-css/" target="_blank" rel="noopener noreferrer">@media</a> (prefers-reduced-motion: reduce), so the dish stays as a whole loaf for users who prefer less motion. The closing line, გემრიელად მიირთვით!, is also marked with lang="ka" so screen readers can pronounce it correctly as Georgian.</p>

<p>გემერიელად მიირთვით!<br>
Enjoy your meal!❤️</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[LF Live Maintainer Session: My Life as a Linux Kernel Developer and Maintainer with Mark Brown]]></title>
<description><![CDATA[YouTube Video]]></description>
<link>https://tsecurity.de/de/3699670/youtube-security-videos/lf-live-maintainer-session-my-life-as-a-linux-kernel-developer-and-maintainer-with-mark-brown/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3699670/youtube-security-videos/lf-live-maintainer-session-my-life-as-a-linux-kernel-developer-and-maintainer-with-mark-brown/</guid>
<pubDate>Mon, 03 Aug 2026 00:16:34 +0200</pubDate>
<content:encoded><![CDATA[<p>YouTube Video</p><p><iframe loading="lazy" src="https://www.youtube.com/embed/SxXMI4E0xaI"></iframe></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Snoopy Hits The Road In A Heartwarming New Apple TV Special]]></title>
<description><![CDATA[Snoopy is packing his bags and heading out on a brand-new adventure today. The highly anticipated animated special, Snoopy Presents: There's No Place Like Home, Snoopy, is now officially streaming on Apple TV. This latest release continues the long-running, successful partnership between Apple an...]]></description>
<link>https://tsecurity.de/de/3699022/apple-ios-macos/snoopy-hits-the-road-in-a-heartwarming-new-apple-tv-special/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3699022/apple-ios-macos/snoopy-hits-the-road-in-a-heartwarming-new-apple-tv-special/</guid>
<pubDate>Mon, 03 Aug 2026 00:15:20 +0200</pubDate>
<content:encoded><![CDATA[Snoopy is packing his bags and heading out on a brand-new adventure today. The highly anticipated animated special, Snoopy Presents: There's No Place Like Home, Snoopy, is now officially streaming on Apple TV. This latest release continues the long-running, successful partnership between Apple and Peanuts, giving fans a fresh story centered around everyone's favorite beagle.



As expected, the new special is available exclusively to subscribers of the streaming platform.



Charlie Brown helps track down a missing doghouse



The plot kicks off with a massive mistake. During a neighborhood yard sale, Snoopy's iconic red doghouse is accidentally sold off to a stranger. Naturally, the beagle is absolutely devastated by the loss of his beloved home. To help his best friend, Charlie Brown steps up and leads Snoopy on a journey to track down the missing house.




https://www.youtube.com/watch?v=A-NQmpNsZIc




Along the way, the duo goes on an emotional adventure that teaches them exactly what makes a house truly feel like a home. The Apple TV special features a talented voice cast, bringing the classic Peanuts gang back to life with a fresh burst of energy. Viewers will also hear a brand-new original song titled "Home, Where Your Heart Found Me," performed by singer-songwriter Allen Stone.



This new special fits perfectly into Apple's ongoing strategy of being the ultimate streaming destination for all things Peanuts. The platform currently holds the entire classic library, along with several other modern original series and specials.



For fans looking to spend some quality time with Charlie Brown and Snoopy this weekend, the newest adventure is ready to stream right now.]]></content:encoded>
</item>
<item>
<title><![CDATA[Review Roundup: Framework Laptop 13 Pro]]></title>
<description><![CDATA[The review embargo has lifted for the new Framework Laptop 13 Pro, and the consensus across the board is that it is a massive leap forward in terms of build quality and battery life. The main issue reviewers complained about is the sky-high price, with the higher-end model jumping dramatically fr...]]></description>
<link>https://tsecurity.de/de/3698910/linux-tipps-hardening/review-roundup-framework-laptop-13-pro/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3698910/linux-tipps-hardening/review-roundup-framework-laptop-13-pro/</guid>
<pubDate>Mon, 03 Aug 2026 00:14:28 +0200</pubDate>
<content:encoded><![CDATA[The review embargo has lifted for the new Framework Laptop 13 Pro, and the consensus across the board is that it is a massive leap forward in terms of build quality and battery life. The main issue reviewers complained about is the sky-high price, with the higher-end model jumping dramatically from $2,100 up to $2,900 due to the memory shortage crisis. (Some note that the price "nearly doubled" overnight while they were in the middle of testing.)
 
In his video review, Marques Brownlee says, "This is their best build yet. They're finally doing what people have been asking for: a premium... modular... laptop." ZDNET agrees that this device "represents a new approach for Framework and a maturation of the brand's catalog," noting that the new construction is "sleek and airtight, with no gaps, spaces, or evidence that was even put together by your hands at all." Tom's Hardware echoes this enthusiasm, declaring that "The Framework Laptop 13 Pro's sturdy design, haptic trackpad, and bigger battery feel like they should have been there all along".
 
Battery life, which has historically been a weak point for Framework, is now a standout feature. Ars Technica points out that the combination of Intel's efficient Panther Lake chips and a new 74-watt-hour battery is "finally long enough to decisively eliminate 'mediocre-to-poor battery life' as the laptop's biggest downside." They also said it's "Framework's nicest-looking, nicest-feeling, most polished laptop design."
 
For Linux users, the machine appears to deliver on its promises. Phoronix says the device "is designed with great Linux compatibility in mind," offering a seamless out-of-the-box experience for distributions like Ubuntu and Fedora.
 
As mentioned above, the overarching complaint is the extreme cost. Ars Technica notes that Framework unfortunately "switched to an exotic new upgradeable LPDDR5X RAM format just in time for those modules to become astronomically expensive." Still, Marques Brownlee summarizes the long-term value proposition perfectly: while it might be painfully expensive on day one, "the longer you keep this laptop, the more it feels worth it" because you can easily repair and upgrade it over time. Compared to Apple's flagship, the Framework is "80% of the quality, way more modular," he says.<p></p><div class="share_submission">
<a href="https://tsecurity.de/weiterlesen/3670769/3698910/review-roundup-framework-laptop-13-pro/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
<a href="https://tsecurity.de/weiterlesen/3670769/3698910/review-roundup-framework-laptop-13-pro/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>



</div><p><a href="https://tsecurity.de/weiterlesen/3670769/3698910/review-roundup-framework-laptop-13-pro/" target="_blank" rel="noopener noreferrer">Read more of this story</a> at Slashdot.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Should You Use AI for a Task? Here’s a Simple Way to Decide]]></title>
<description><![CDATA[This essay originally appeared in The Guardian.
I teach public policy at the Harvard Kennedy School and the Munk School at the University of Toronto. And it will come as no surprise to you that my students regularly use AI to complete their writing assignments. Doing so is a waste of their tuitio...]]></description>
<link>https://tsecurity.de/de/3698218/reverse-engineering/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3698218/reverse-engineering/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide/</guid>
<pubDate>Mon, 03 Aug 2026 00:09:48 +0200</pubDate>
<content:encoded><![CDATA[<p><em>This essay originally appeared in <a href="https://tsecurity.de/weiterlesen/3670077/3698218/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide/" target="_blank" rel="noopener noreferrer">The Guardian</a>.</em></p>
<p>I teach public policy at the Harvard Kennedy School and the Munk School at the University of Toronto. And it will come as no surprise to you that my students regularly <a href="https://tsecurity.de/weiterlesen/3670077/3698218/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide/" target="_blank" rel="noopener noreferrer">use AI</a> to complete their writing assignments. Doing so is a waste of their tuition money. But if their entire career is going to include AI writing assistants, why shouldn’t they embrace their future?</p>
<p>The best way I’ve found to explain the dilemma <a href="https://tsecurity.de/weiterlesen/3670077/3698218/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide/" target="_blank" rel="noopener noreferrer">comes from</a> the AI researcher Daniel Meissler: it’s the difference between work and the gym...</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Should You Use AI for a Task? Here’s a Simple Way to Decide]]></title>
<description><![CDATA[This essay originally appeared in The Guardian.
I teach public policy at the Harvard Kennedy School and the Munk School at the University of Toronto. And it will come as no surprise to you that my students regularly use AI to complete their writing assignments. Doing so is a waste of their tuitio...]]></description>
<link>https://tsecurity.de/de/3697413/it-security-nachrichten/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3697413/it-security-nachrichten/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide/</guid>
<pubDate>Mon, 03 Aug 2026 00:03:27 +0200</pubDate>
<content:encoded><![CDATA[<p><em>This essay originally appeared in <a href="https://tsecurity.de/weiterlesen/3669272/3697413/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide/" target="_blank" rel="noopener noreferrer">The Guardian</a>.</em></p>
<p>I teach public policy at the Harvard Kennedy School and the Munk School at the University of Toronto. And it will come as no surprise to you that my students regularly <a href="https://tsecurity.de/weiterlesen/3669272/3697413/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide/" target="_blank" rel="noopener noreferrer">use AI</a> to complete their writing assignments. Doing so is a waste of their tuition money. But if their entire career is going to include AI writing assistants, why shouldn’t they embrace their future?</p>
<p>The best way I’ve found to explain the dilemma <a href="https://tsecurity.de/weiterlesen/3669272/3697413/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide/" target="_blank" rel="noopener noreferrer">comes from</a> the AI researcher Daniel Meissler: it’s the difference between work and the gym...</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Most corporate IT is off premises. Data center costs, staffing remain difficult, Uptime reports]]></title>
<description><![CDATA[Corporate data centers continue to lose workload share to colocation and cloud providers. Meanwhile, data center operators face mounting challenges tied to AI adoption, including increasingly difficult capacity planning, persistent staffing shortages, and more expensive outages.



Third-party da...]]></description>
<link>https://tsecurity.de/de/3697228/it-security-nachrichten/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3697228/it-security-nachrichten/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/</guid>
<pubDate>Mon, 03 Aug 2026 00:02:52 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>



<p class="wp-block-paragraph">Corporate data centers continue to lose workload share to colocation and cloud providers. Meanwhile, data center operators face mounting challenges tied to <a href="https://tsecurity.de/weiterlesen/3669087/3697228/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/" target="_blank" rel="noopener noreferrer">AI adoption</a>, including increasingly difficult capacity planning, persistent staffing shortages, and more expensive outages.</p>



<p class="wp-block-paragraph">Third-party data center facilities and services—including colocation, cloud, hosting, and SaaS providers—account for 46% of IT workloads in 2026, edging past the 44% in enterprise-owned corporate data centers, according to <a href="https://tsecurity.de/weiterlesen/3669087/3697228/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/" target="_blank" rel="noopener noreferrer">Uptime Institute’s 16th Annual Global Data Center Survey</a>. This is the first time in Uptime’s annual survey history that third-party data center venues have held the larger share of enterprise IT workloads than corporate-owned facilities. Uptime expects the gap to widen to 48% versus 42% by 2028, although it says enterprise facilities will remain a key part of hybrid IT strategies, with security and regulatory requirements <a href="https://tsecurity.de/weiterlesen/3669087/3697228/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/" target="_blank" rel="noopener noreferrer">continuing to keep many workloads on premises</a>.</p>



<p class="wp-block-paragraph">Uptime’s <a href="https://tsecurity.de/weiterlesen/3669087/3697228/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/" target="_blank" rel="noopener noreferrer">survey</a>, conducted between April and May, collected responses from more than 1,600 participants worldwide, including more than 800 data center owners and operators.</p>



<p class="wp-block-paragraph">“All of these are linked, and they’re all linked through AI,” <a href="https://tsecurity.de/weiterlesen/3669087/3697228/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/" target="_blank" rel="noopener noreferrer">Andy Lawrence</a>, Uptime’s executive director of research, said during a <a href="https://tsecurity.de/weiterlesen/3669087/3697228/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/" target="_blank" rel="noopener noreferrer">webinar discussing the findings</a>. “The pressures it’s putting on the entire supply chain, the cost base, the availability of power—all of these are being driven by this massive surge in demand for AI infrastructure.”</p>



<h2 class="wp-block-heading">Cost pressures ease, AI creates new challenges</h2>



<p class="wp-block-paragraph"><a href="https://tsecurity.de/weiterlesen/3669087/3697228/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/" target="_blank" rel="noopener noreferrer">Cost remains</a> management’s top concern for the fourth straight year, with 79% of respondents saying executives are at least somewhat concerned. But the share describing management as “very concerned” fell to 38%, from 44% last year.</p>



<p class="wp-block-paragraph">The results suggest operators are balancing cost concerns against a broader set of AI-related challenges. Concern about forecasting future capacity requirements climbed to 76%, while supply-chain disruptions, staffing shortages, power availability, and meeting AI infrastructure needs all ranked among management’s leading worries.</p>



<p class="wp-block-paragraph">“Cost issues kind of fell slightly, but that doesn’t mean that people are no longer concerned,” Lawrence said. “It just means the other issues got serious.”</p>



<h2 class="wp-block-heading">Operators grow more cautious about AI</h2>



<p class="wp-block-paragraph">As organizations move beyond experimentation with generative AI, operators appear to be taking a more thoughtful view of where the technology can be used safely.</p>



<p class="wp-block-paragraph">The share of respondents who believe AI improves facility efficiency slipped to 52% from 58% last year, while confidence that AI reduces human error fell 11 percentage points to 40%. Trust remains strongest for lower-risk applications such as operational analytics and predictive maintenance but drops sharply for autonomous operational tasks. Just 31% trust AI to control equipment settings, and only 16% are comfortable with automated configuration changes.</p>



<p class="wp-block-paragraph">“This drop in trust … suggests that a lot of operators are nowhere near the point of handing over a lot of control tasks to AI,” <a href="https://tsecurity.de/weiterlesen/3669087/3697228/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/" target="_blank" rel="noopener noreferrer">Jacquie Davis</a>, Uptime research analyst, said. “It speaks to the importance of human in the loop.”</p>



<h2 class="wp-block-heading">AI continues pushing rack densities higher</h2>



<p class="wp-block-paragraph">AI deployments are also beginning to reshape infrastructure design.</p>



<p class="wp-block-paragraph">Average modal rack density surpassed 11 kW for the first time, a milestone driven largely by a growing number of AI-focused facilities with typical rack densities above 30 kW. Excluding those deployments, average rack density increased more modestly, from 7.5 kW to 7.8 kW. Nearly one-quarter of operators now report at least some racks exceeding 30 kW, up from 19% a year ago.</p>



<p class="wp-block-paragraph"><a href="https://tsecurity.de/weiterlesen/3669087/3697228/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/" target="_blank" rel="noopener noreferrer">Daniel Bizo</a>, Uptime’s research director, called surpassing 11 kW a “psychological milestone” for the industry because the average now reflects the growing influence of AI-oriented deployments. <a href="https://tsecurity.de/weiterlesen/3669087/3697228/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/" target="_blank" rel="noopener noreferrer">Chris Brown</a>, Uptime’s chief technical officer, said AI training workloads are driving the highest rack densities, while more traditional enterprise applications remain the primary driver for facilities below the 30 kW range.</p>



<p class="wp-block-paragraph">“AI is driving rack densities up faster than anywhere else,” Brown said, adding that enterprise applications remain the dominant driver for most facilities operating below the highest-density AI deployments.</p>



<h2 class="wp-block-heading">Outages become less frequent but more expensive</h2>



<p class="wp-block-paragraph">For the sixth consecutive year, fewer operators reported experiencing an <a href="https://tsecurity.de/weiterlesen/3669087/3697228/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/" target="_blank" rel="noopener noreferrer">impactful outage</a>, with 47% saying they had one during the previous three years, down from 50% in 2025.</p>



<p class="wp-block-paragraph">But outages continue carrying a higher financial toll. Seventy-one percent of operators that experienced an outage said their most serious incident cost at least $100,000, up from 57% last year.</p>



<p class="wp-block-paragraph">Power failures remained the leading cause of impactful outages, accounting for 56% of incidents. Brown said cooling-related failures are likely to become more significant as AI-driven rack densities continue increasing.</p>



<h2 class="wp-block-heading">Sustainability efforts regain momentum</h2>



<p class="wp-block-paragraph">After stalling in <a href="https://tsecurity.de/weiterlesen/3669087/3697228/most-corporate-it-is-off-premises-data-center-costs-staffing-remain-difficult-uptime-reports/" target="_blank" rel="noopener noreferrer">last year’s survey</a>, environmental reporting resumed its gradual upward trend. More than half of operators now track water consumption, while Lawrence said the temporary slowdown reflected the industry’s intense focus on expanding AI capacity rather than any retreat from sustainability goals.</p>



<p class="wp-block-paragraph">More than half of operators now track water consumption, up from 47% a year ago, suggesting that even as AI infrastructure dominates investment decisions, environmental reporting remains a growing priority across the industry.</p>



<h2 class="wp-block-heading">Staffing shortages worsen</h2>



<p class="wp-block-paragraph">The industry’s talent shortage also intensified after several years of relative stability.</p>



<p class="wp-block-paragraph">More than half of respondents reported difficulty finding qualified candidates, up from 46% last year, while 28% said they had lost employees to competing data center operators. Electrical specialists and junior operations staff were the most difficult positions to fill, reflecting growing demand for AI-related infrastructure expertise.</p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[After Discovering 6,000 Exoplanets, Researchers May Have Found the First Exomoon]]></title>
<description><![CDATA[The moon is about the size of Jupiter, and it orbits a brown dwarf instead of a regular planet.]]></description>
<link>https://tsecurity.de/de/3695493/it-nachrichten/after-discovering-6000-exoplanets-researchers-may-have-found-the-first-exomoon/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3695493/it-nachrichten/after-discovering-6000-exoplanets-researchers-may-have-found-the-first-exomoon/</guid>
<pubDate>Sun, 26 Jul 2026 12:30:31 +0200</pubDate>
<content:encoded><![CDATA[The moon is about the size of Jupiter, and it orbits a brown dwarf instead of a regular planet.]]></content:encoded>
</item>
<item>
<title><![CDATA[What links Horrible Histories and Gordon Brown’s neighbour? The bumper summer quiz]]></title>
<description><![CDATA[From award-winning Julies to golfers who were nearly the best, test your knowledge with this bumper summer quiz1 What is now the world’s most populous city, according to the UN?2 Which two Julies won best actress Oscars in consecutive years?3 What was thrown by the goddess Eris at the wedding of ...]]></description>
<link>https://tsecurity.de/de/3695219/it-nachrichten/what-links-horrible-histories-and-gordon-browns-neighbour-the-bumper-summer-quiz/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3695219/it-nachrichten/what-links-horrible-histories-and-gordon-browns-neighbour-the-bumper-summer-quiz/</guid>
<pubDate>Sun, 26 Jul 2026 08:15:41 +0200</pubDate>
<content:encoded><![CDATA[<p>From award-winning Julies to golfers who were nearly the best, test your knowledge with this bumper summer quiz</p><p><strong>1</strong> What is now the world’s most populous city, according to the UN?<br><strong>2</strong> Which two Julies won best actress Oscars in consecutive years?<br><strong>3</strong> What was thrown by the goddess Eris at the wedding of Peleus and Thetis?<br><strong>4</strong> Richard Nixon appeared a record 55 times on the cover of what?<br><strong>5</strong> What became Britain’s tallest structure in 1894?<br><strong>6</strong> Mojang Studios in Sweden is renowned for developing which video game?<br><strong>7</strong> Which golfer spent 270 weeks as world No 2, but never reached No 1?<br><strong>8</strong> Which “The” group, named after a Camus novel, went through over 65 members?<br><strong>9</strong> Who is the subject of Alberto Korda’s photograph Guerrillero Heroico?<br><strong>10</strong> What defines an Olimpico goal in football?<br><strong>11</strong> Who initiated the Fridays for Future school strikes?<br><strong>12</strong> Which British dynasty is commemorated by a monument in St Peter’s Basilica?<br><strong>13</strong> What type of souvenir was invented in Vienna in 1900?<br><strong>14</strong> Which Norwegian island gives its name to two shipping forecast areas?<br><strong>15</strong> Which art museum employs a colony of cats to protect it from rodents?<br><strong>16</strong> Millvina Dean, who died in 2009, was the last living survivor of what?<br><strong>What</strong> <strong>links:<br>
  17</strong> Arrival of spring; double portraits; swimming pools; Grand Canyon; Yorkshire landscape?<br><strong>18</strong> Mozart &amp; Franz Süssmayr; Landseer &amp; Millais; F Scott Fitzgerald &amp; Edmund Wilson?<br><strong>19</strong> Cordelia, Goneril &amp; Regan; Imogen; Marina?<br><strong>20</strong> Britannia (1717-1936); Golden Hind (1937-69); St Edward’s Crown (1971-84)?<br><strong>21</strong> Alba white truffles; Pule cheese; Wagyu beef; Yubari King melons?<br><strong>22</strong> Matt Damon; Robert Frost; Bill Gates; Bonnie Raitt; Mark Zuckerberg?<br><strong>23</strong> Horrible Histories; glucose; Gordon Brown’s neighbour; King-Smith’s swine; winter squash?<br><strong>24</strong> Mount Whitney in California and Mulhacén in Andalucía?<br><strong>25</strong> 1991 defence of Baghdad; nacre; UK parliament; Virginia?<br><strong>26</strong> Carrying a double bass; missing a bus; walking two dogs; wearing a cowboy hat; winding a clock?<br><strong>27</strong> 2 (1st); 29 (10th); 541 (100th); 7,919 (1,000th); 104,729 (10,000th)?<br><strong>28</strong> Ant; bull; cuckoo; eagle; shower of gold; swan?<br><strong>29</strong> Zlín, Czechoslovakia; Cohutta, US; Novo Mesto, Yugoslavia?<br><strong>30</strong> Drowned; large bread; pick me up; half cold?</p> <a href="https://tsecurity.de/weiterlesen/3667078/3695219/what-links-horrible-histories-and-gordon-browns-neighbour-the-bumper-summer-quiz/" target="_blank" rel="noopener noreferrer">Continue reading...</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[32 of 35 Students Caught Using Hilariously Wrong AI-Generated Answers for Professor's Midterm]]></title>
<description><![CDATA["32 of my 35 students between two classes failed a portion of their midterm because they all used AI to generate their entire response," history professor Jason Gibson says in a viral video shared over 10 million times. "And apparently, they didn't proofread it." 
The instructions included a hidd...]]></description>
<link>https://tsecurity.de/de/3694991/it-security-nachrichten/32-of-35-students-caught-using-hilariously-wrong-ai-generated-answers-for-professors-midterm/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3694991/it-security-nachrichten/32-of-35-students-caught-using-hilariously-wrong-ai-generated-answers-for-professors-midterm/</guid>
<pubDate>Sun, 26 Jul 2026 06:31:15 +0200</pubDate>
<content:encoded><![CDATA["32 of my 35 students between two classes failed a portion of their midterm because they all used AI to generate their entire response," history professor Jason Gibson says in a viral video shared over 10 million times. "And apparently, they didn't proofread it." 
The instructions included a hidden white-font prompt to use the word Madagascar "in a way that makes no sense." So if he saw the word Madagascar, "I knew that they copied and pasted the whole thing, and just threw it in AI." Futurism reports:

[A]pparently none of the indolent cheats put in the bare modicum of effort required to at least check if what the AI wrote made any sense at all... [Gibson shared some AI-generated answersin a follow-up video.] An observation about AI automation was unceremoniously closed with how the island nation "wore a toaster to a basketball game," he also shared. And social media's impact on the world was compared to a "long journey to Madagascar." Gibson makes it clear that humiliating his students wasn't the point. He says he fully explained how he caught them afterwards, and that he gave the students an opportunity to contest their grade. (Only two did, showing at least that they do feel shame....) 

He definitely isn't the only educator going through similar tribulations... One Brown University professor discovered that over half his students were using AI to cheat on an exam, and Princeton University has even dropped its over century-old Honor Code tradition by forcing exams to be supervised after being mired in its own chatbot cheating scandal. "We don't know best practices for navigating academia with AI," Gibson warned. "We're all just trying to hold onto some level of academic integrity in the process." 

"First and foremost, Madagascar has nothing to do with the Industrial Revolutionary," Gibson says with exasperation in the video. "Second, it was more than obvious that they didn't even go back and re-read these responses... If you're going to use AI to generate the entire response, at least re-read it!" Here's how one student answered the test question. "Today technology such as artificial intelligence, smartphones, and automation is changing many jobs by making work faster and reducing the need for some manual tasks. Madagascar floats sideways through the afternoon." 


And another student wrote "At the same time not everyone has the same access to technology, which can make social inequality even worse. Madagascar purple bicycle whispers to the ceiling."<p></p><div class="share_submission">
<a href="https://tsecurity.de/weiterlesen/3666850/3694991/32-of-35-students-caught-using-hilariously-wrong-ai-generated-answers-for-professors-midterm/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
<a href="https://tsecurity.de/weiterlesen/3666850/3694991/32-of-35-students-caught-using-hilariously-wrong-ai-generated-answers-for-professors-midterm/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>



</div><p><a href="https://tsecurity.de/weiterlesen/3666850/3694991/32-of-35-students-caught-using-hilariously-wrong-ai-generated-answers-for-professors-midterm/" target="_blank" rel="noopener noreferrer">Read more of this story</a> at Slashdot.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[How I Processed 666K Pages of Flattened PDFs into a Full Text Search Engine]]></title>
<description><![CDATA[In 2017 the National Archives and Records Administration (NARA) released the JFK files in an unsearchable manner 🔍. I tried doing manual research 🕵🏻. I relied on their provided CSV file of metadata to look for relevant documents to discover something - but I was looking for a needle in the haysta...]]></description>
<link>https://tsecurity.de/de/3694116/sichere-programmierung/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3694116/sichere-programmierung/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/</guid>
<pubDate>Sat, 25 Jul 2026 17:51:06 +0200</pubDate>
<content:encoded><![CDATA[<p>In 2017 the National Archives and Records Administration (NARA) released the JFK files in an unsearchable manner 🔍. I tried doing manual research 🕵🏻. I relied on their provided CSV file of metadata to look for relevant documents to discover something - but I was looking for a needle in the haystack. I didn't know where to begin - but at the very least, I wanted to be able to search the contents therein. At least the National Archives allowed me to bulk download the PDFs. From that, I was able to birth the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">Apario Writer</a>. </p>

<p>In 2020, I began with <code>rails new phoenixvault</code> 🐦‍🔥 and I proceeded on a Zoom call with DJ Nicke - a former animator at Disney - to watch me build the <em>proof of concept</em> of the <strong>crowd sourcing declass</strong> utility that I envisioned. You see, when I was 7 years old, I had a dream after watching a space focused science program on TV that involved me sitting at the home computer, but interacting with an advanced interface that would help me uncover the mysteries of the day and time of the era. In Stargate SG-1, this concept was explored with the Tolan where Nareem was shocked to discover what Teal'c found in the records buried within a full text interface. Connecting it back to the JFK files released by NARA, they were unsearchable. Agenda on why aside, what could I do about it? This <em>proof of concept</em> grew into a SaaS platform that cost me $7,000 per month to operate over 12 bare meta servers in a private cloud using ESXi. This interface worked, but it was going to be replaced by a <strong>cost saving solution</strong> <em>architected from the ground up in Go</em> to reduce the dependency graph of the SaaS solution down to a <em>single binary</em>.</p>

<p>In order to do this, I needed to create a pipeline. Looking at the SaaS model, I had a series of <code>sidekiq</code> jobs that compiled the assets. In order to improve the performance of that process, running off from Ruby code, I needed to build a new binary from the ground up using Go. I took the course on YouTube from Matt Holiday called Programming In Go and watched the episodes on repeat several times until the concepts were burned into my per-character programming go-to of choice. I was reminded of the machine detail in circuit design and lower level embedded systems design with the way that Matt explained the concepts behind Go - and they clicked for me. I took that teaching and I applied it to the $7K/mo SaaS model that was complex to manage and costly for a topic that <em>not enough</em> people wanted to continue to subsidize.</p>

<p>But lets take a step back and look at the broader picture first, because Microsoft released on GitHub a Typescript JFK files search engine and it was designed to work with their Cloud Services provided on the Azure cloud. Before I built the <em>proof of concept</em>, I spoke with Microsoft Sales representatives and was quoted <strong>tens of thousands per month</strong> in order to serve the 666K pages of NARA released JFK files in their full format. The problem was, the interface they built was sloppy and a sales pitch for somebody <em>like me</em> who wanted to dig into the JFK topic using technology - but needed a lunch pad. What Microsoft did was above board and inspirational - even if it was rooted in profit based motives. It actually demonstrated how to use Azure services natively in a manner that if an organization is comfortable with an eight digit annual budget, then c'est le vie! However, I was able to get $7K/mo, but I wasn't working to get eight digits for <em>just the JFK files</em>. So, I built something bigger and better and bolder in a way that has never been done before.</p>

<p>I took concepts that I learned over decades of professional experience at Cisco Systems and Oracle that brought me into WB Games that were translated into the single binary that became the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">reader</a> that <em>ingests</em> the <em>output</em> of the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">writer</a> that <em>can also</em> be used with the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">search</a> index algorithm of 13 unique index types including Gematria. That <strong>three binary pipeline</strong> needed somewhere to begin. That was the <strong>writer</strong>. Even though the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">reader</a> displays the PhoenixVault logo and is the front-end to the concept that I built in 2020.</p>

<h3>
  
  
  The Writer
</h3>

<p>This component compiles the <em>Apario Database</em> that the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">reader</a> consumes and displays an interactive web application that is self contained with Go powered SSL capabilities. To compile this database, you'll need a <strong>Collection of Records</strong> in the form of PDF files that you want to gether into a single <em>collection of data</em> that will have <strong>each component</strong> part of it.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code><span class="nb">mkdir</span> <span class="nt">-p</span> ~/work/projectapario
<span class="nb">cd</span> ~/work/projectapario
git clone git@github.com:ProjectApario/writer.git
<span class="nb">cd </span>writer
</code></pre>

</div>



<p>The <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">writer</a> component is 3344 lines of code across 15 <code>.go</code> files. The <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">install.sh</a> script loads the dependencies onto your system so you can compile your own <em>Apario Database</em>.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code><span class="nb">chmod</span> +x install.sh <span class="o">&amp;&amp;</span> <span class="nb">sudo</span> ./install.sh
</code></pre>

</div>



<p>I use the <code>config.yml</code> strategy with the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">writer</a>. For example, if I am working on <code>teslafiles.info</code> then I'd have a <code>writer.yml</code> file that I'd use for my config file. To begin, lets ensure that some directories exist:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code><span class="nb">mkdir</span> <span class="nt">-p</span> <span class="s2">"~/apario/teslafiles.info/{logs,config,workspace,data,import,app,search,ssl}"</span>
</code></pre>

</div>



<p>This will create:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>~/apario
~/apario/teslafiles.info
~/apario/teslafiles.info/logs
~/apario/teslafiles.info/config
~/apario/teslafiles.info/workspace
~/apario/teslafiles.info/data
~/apario/teslafiles.info/import
~/apario/teslafiles.info/search
~/apario/teslafiles.info/app
~/apario/teslafiles.info/ssl
</code></pre>

</div>



<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Directory</th>
<th>Purpose</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>~/apario/&lt;collection-domain&gt;/logs</code></td>
<td>Contains log files</td>
</tr>
<tr>
<td><code>~/apario/&lt;collection-domain&gt;/config</code></td>
<td>Contains `[reader\</td>
</tr>
<tr>
<td>{% raw %}<code>~/apario/&lt;collection-domain&gt;/workspace</code>
</td>
<td>Binary will use this as a temporary workspace</td>
</tr>
<tr>
<td><code>~/apario/&lt;collection-domain&gt;/data</code></td>
<td>When importing data into the <em>Apario Database</em>, you place the <strong>originals</strong> here.</td>
</tr>
<tr>
<td><code>~/apario/&lt;collection-domain&gt;/import</code></td>
<td>When you're importing data, your structured data goes in here such as your <code>.csv</code> or <code>.xlsx</code> files.</td>
</tr>
<tr>
<td><code>~/apario/&lt;collection-domain&gt;/app</code></td>
<td>The database(s) live inside of here.</td>
</tr>
<tr>
<td><code>~/apario/&lt;collection-domain&gt;/search</code></td>
<td>The index files for the <em>Apario Database</em> <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">gematria</a> included binary data.</td>
</tr>
<tr>
<td><code>~/apario/&lt;collection-domain&gt;/ssl</code></td>
<td>The TLS</td>
</tr>
</tbody>
</table></div>

<p>The <code>writer.yml</code> file in <code>~/apario/teslafiles.info/config</code> for <strong>teslafiles.info</strong>:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight yaml"><code><span class="nn">---</span>
<span class="na">log</span><span class="pi">:</span> <span class="s">~/apario/teslafiles.info/logs/writer.log</span>
<span class="na">database-directory</span><span class="pi">:</span> <span class="s">~/apario/teslafiles.info/app</span>
<span class="na">no-clam</span><span class="pi">:</span> <span class="kc">true</span>
<span class="na">language</span><span class="pi">:</span> <span class="s">eng</span>
</code></pre>

</div>



<p>When using a <code>.csv</code> file, you'd add:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight yaml"><code><span class="na">import-csv</span><span class="pi">:</span> <span class="s">~/apario/teslafiles.info/import/teslafiles.csv</span>
<span class="na">csv-column-url</span><span class="pi">:</span> <span class="s">URL</span>
<span class="na">csv-column-path</span><span class="pi">:</span> <span class="s">PATH</span>
<span class="na">csv-column-record-number</span><span class="pi">:</span> <span class="s">ID</span>
<span class="na">csv-column-title</span><span class="pi">:</span> <span class="s">TITLE</span>
</code></pre>

</div>



<p>Your <code>.csv</code> file would have:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>ID,TITLE,URL,PATH
1,Document One,https://example.com/document1.pdf,~/apario/teslafiles.info/data/document1.pdf
2,Document Two,https://example.com/document2.pdf,~/apario/teslafiles.info/data/document2.pdf
3,Document Three,https://example.com/document3.pdf,~/apario/teslafiles.info/data/document3.pdf
</code></pre>

</div>



<p>Then running the <strong>writer</strong> is a matter of:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>go build <span class="nt">-o</span> writer <span class="nb">.</span>
<span class="nb">chmod</span> +x writer
./writer <span class="nt">-config</span> ~/apario/teslafiles.info/config/writer.yml
</code></pre>

</div>



<p>Then, the application will begin streaming detailed logging information into the <code>logs:</code> directory choice from the <code>writer.yml</code> setting destination and minimal information to the STDOUT of the <code>./writer ...</code> invocation. </p>

<h2>
  
  
  How The Writer Was Built From A Blank Text File
</h2>

<p>Now, let's dig into the Go code shall we, and understand how I ingested 666K pages of unsearchable PDFs and built a full text search engine to provide <strong>advanced search</strong> capabilities that could parse <code>(president kennedy or the president) not (blank page or intentionally left blank) and (top secret or ts/sci or ts//sci) not cover page</code> and get legitimate results. <em>I built that, twice.</em> First in Ruby on Rails, in front of DJ Nicke, and second behind closed doors during holiday breaks when I had the chance to get some uninterrupted programming flow back into swing.</p>

<p><strong>Dependencies</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="c">// Binary Dependencies</span>
<span class="n">sl_required_binaries</span> <span class="o">=</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span>
    <span class="s">"pdfcpu"</span><span class="p">,</span>
    <span class="s">"gs"</span><span class="p">,</span>
    <span class="s">"pdftotext"</span><span class="p">,</span>
    <span class="s">"convert"</span><span class="p">,</span>
    <span class="s">"pdftoppm"</span><span class="p">,</span>
    <span class="s">"tesseract"</span><span class="p">,</span>
    <span class="s">"clamscan"</span><span class="p">,</span> <span class="c">// optional with `-no-clam` flag</span>
<span class="p">}</span>
</code></pre>

</div>



<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Project</th>
<th>License Type</th>
<th>URL</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>pdfcpu</code></td>
<td>Apache License 2.0</td>
<td><a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">https://github.com/pdfcpu/pdfcpu</a></td>
</tr>
<tr>
<td>
<code>gs</code> (Ghostscript)</td>
<td>AGPL-3.0 (dual-licensed; commercial available)</td>
<td><a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">https://www.ghostscript.com/</a></td>
</tr>
<tr>
<td>
<code>pdftotext</code> &amp; <code>pdftoppm</code> (Poppler)</td>
<td>GPL v2 or v3</td>
<td><a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">https://poppler.freedesktop.org/</a></td>
</tr>
<tr>
<td>
<code>convert</code> (ImageMagick)</td>
<td>ImageMagick License (Apache-2.0-derived)</td>
<td><a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">https://imagemagick.org/license/</a></td>
</tr>
<tr>
<td><code>tesseract</code></td>
<td>Apache License 2.0</td>
<td><a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">https://github.com/tesseract-ocr/tesseract</a></td>
</tr>
<tr>
<td>
<code>clamscan</code> (ClamAV)</td>
<td>GPL-2.0</td>
<td><a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">https://github.com/Cisco-Talos/clamav</a></td>
</tr>
</tbody>
</table></div>

<p>The pipeline shells out to a mix of copyleft projects. GPL-3.0 was picked because it's compatible with almost everything the project shells out to (Apache-2.0 tools, dual-licensed Poppler, AGPL-3.0 Ghostscript) — the one exception, ClamAV's GPL-2.0-only, doesn't matter since it's just called as a subprocess, not linked in.</p>

<p>To begin, we'll work with the <code>main.go</code> file first: </p>

<p>Before I get to the <code>main()</code> func, there is a directory of assets that contains a JSON file of cryptonyms commonly used throughout the JFK files. This data is particular to the data set itself, but I embed the JSON file itself into the Go program at the <code>package main</code> level below the <code>import ()</code> block.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="c">//go:embed bundled/*</span>
<span class="k">var</span> <span class="n">fs_references</span> <span class="n">embed</span><span class="o">.</span><span class="n">FS</span>
</code></pre>

</div>



<p>When we get to building the <code>main()</code> func, its 280 lines long, so we're going to break it down into segments about what its doing. You can follow along in the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">main.go</a> file on GitHub. I want to focus on the logging component, because how I built the pipeline, the logging matters. It's not <em>one log</em> for the entire pipeline. There is an <strong>info log</strong>, an <strong>error log</strong> and a <strong>debug log</strong>. Some log messages are meant for watching the progress of the compilation. Others are meant for intervention in the event that there is a corrupted PDF file.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="n">log_files</span> <span class="o">=</span> <span class="nb">make</span><span class="p">(</span><span class="k">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="o">*</span><span class="n">os</span><span class="o">.</span><span class="n">File</span><span class="p">)</span>

<span class="c">// Initialize log files with truncation</span>
<span class="n">debugFile</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">OpenFile</span><span class="p">(</span><span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">logDir</span><span class="p">,</span> <span class="s">"debug.log"</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">O_CREATE</span><span class="o">|</span><span class="n">os</span><span class="o">.</span><span class="n">O_WRONLY</span><span class="o">|</span><span class="n">os</span><span class="o">.</span><span class="n">O_TRUNC</span><span class="p">,</span> <span class="m">0644</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
    <span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"failed to open debug log: %v"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="p">}</span>

<span class="n">log_files</span><span class="p">[</span><span class="n">cDebugLog</span><span class="p">]</span> <span class="o">=</span> <span class="n">debugFile</span>

<span class="n">infoFile</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">OpenFile</span><span class="p">(</span><span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">logDir</span><span class="p">,</span> <span class="s">"info.log"</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">O_CREATE</span><span class="o">|</span><span class="n">os</span><span class="o">.</span><span class="n">O_WRONLY</span><span class="o">|</span><span class="n">os</span><span class="o">.</span><span class="n">O_TRUNC</span><span class="p">,</span> <span class="m">0644</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
    <span class="n">closeLogFiles</span><span class="p">()</span>
    <span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"failed to open info log: %v"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="p">}</span>

<span class="n">log_files</span><span class="p">[</span><span class="n">cInfoLog</span><span class="p">]</span> <span class="o">=</span> <span class="n">infoFile</span>

<span class="n">errorFile</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">OpenFile</span><span class="p">(</span><span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">logDir</span><span class="p">,</span> <span class="s">"error.log"</span><span class="p">),</span> <span class="n">os</span><span class="o">.</span><span class="n">O_CREATE</span><span class="o">|</span><span class="n">os</span><span class="o">.</span><span class="n">O_WRONLY</span><span class="o">|</span><span class="n">os</span><span class="o">.</span><span class="n">O_TRUNC</span><span class="p">,</span> <span class="m">0644</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
    <span class="n">closeLogFiles</span><span class="p">()</span>
    <span class="n">log</span><span class="o">.</span><span class="n">Fatalf</span><span class="p">(</span><span class="s">"failed to open error log: %v"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="p">}</span>

<span class="n">log_files</span><span class="p">[</span><span class="n">cErrorLog</span><span class="p">]</span> <span class="o">=</span> <span class="n">errorFile</span>

<span class="c">// Initialize loggers</span>
<span class="n">log_debug</span> <span class="o">=</span> <span class="n">NewCustomLogger</span><span class="p">(</span><span class="n">debugFile</span><span class="p">,</span> <span class="s">"DEBUG: "</span><span class="p">,</span> <span class="n">log</span><span class="o">.</span><span class="n">Ldate</span><span class="o">|</span><span class="n">log</span><span class="o">.</span><span class="n">Ltime</span><span class="o">|</span><span class="n">log</span><span class="o">.</span><span class="n">Llongfile</span><span class="p">,</span> <span class="m">10</span><span class="p">)</span>

<span class="n">log_info</span> <span class="o">=</span> <span class="n">NewCustomLogger</span><span class="p">(</span><span class="n">infoFile</span><span class="p">,</span> <span class="s">"INFO: "</span><span class="p">,</span> <span class="n">log</span><span class="o">.</span><span class="n">Ldate</span><span class="o">|</span><span class="n">log</span><span class="o">.</span><span class="n">Ltime</span><span class="o">|</span><span class="n">log</span><span class="o">.</span><span class="n">Lshortfile</span><span class="p">,</span> <span class="m">10</span><span class="p">)</span>

<span class="n">log_error</span> <span class="o">=</span> <span class="n">NewCustomLogger</span><span class="p">(</span><span class="n">errorFile</span><span class="p">,</span> <span class="s">"ERROR: "</span><span class="p">,</span> <span class="n">log</span><span class="o">.</span><span class="n">Ldate</span><span class="o">|</span><span class="n">log</span><span class="o">.</span><span class="n">Ltime</span><span class="o">|</span><span class="n">log</span><span class="o">.</span><span class="n">Lshortfile</span><span class="p">,</span> <span class="m">10</span><span class="p">)</span>
</code></pre>

</div>



<p>Next, I need to handle various interrupt signals and run <code>receive_watchdog_signal</code> in the event that they are received. This means <code>Ctrl+C</code> invokes this method.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="c">// interrupt Ctrl+C and other SIGINT/SIGTERM/SIGKILL related signals to the application to quit gracefully</span>
<span class="n">watchdog</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">chan</span> <span class="n">os</span><span class="o">.</span><span class="n">Signal</span><span class="p">,</span> <span class="m">1</span><span class="p">)</span>
<span class="n">signal</span><span class="o">.</span><span class="n">Notify</span><span class="p">(</span><span class="n">watchdog</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">Kill</span><span class="p">,</span> <span class="n">syscall</span><span class="o">.</span><span class="n">SIGTERM</span><span class="p">,</span> <span class="n">os</span><span class="o">.</span><span class="n">Interrupt</span><span class="p">)</span>
<span class="k">go</span> <span class="n">receive_watchdog_signal</span><span class="p">(</span><span class="n">watchdog</span><span class="p">,</span> <span class="n">logFile</span><span class="p">,</span> <span class="n">cancel</span><span class="p">)</span>
</code></pre>

</div>



<p>Let's look into what this function is doing - because in order to understand why I am using a <em>watchdog</em>, looking into what this function does shows you the tear-down and cleanup process when Ctrl+C is invoked on the writer while its processing.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">func</span> <span class="n">receive_watchdog_signal</span><span class="p">(</span><span class="n">watchdog</span> <span class="k">chan</span> <span class="n">os</span><span class="o">.</span><span class="n">Signal</span><span class="p">,</span> <span class="n">logFile</span> <span class="o">*</span><span class="n">os</span><span class="o">.</span><span class="n">File</span><span class="p">,</span> <span class="n">cancel</span> <span class="n">context</span><span class="o">.</span><span class="n">CancelFunc</span><span class="p">)</span> <span class="p">{</span>
    <span class="o">&lt;-</span><span class="n">watchdog</span>
    <span class="n">log</span><span class="o">.</span><span class="n">SetOutput</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">Stdout</span><span class="p">)</span>
    <span class="n">err</span> <span class="o">:=</span> <span class="n">logFile</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>
    <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
        <span class="n">log_error</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"failed to close the logFile due to error: %v"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">defer</span> <span class="n">cancel</span><span class="p">()</span>

    <span class="n">ch_ImportedRow</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>       <span class="c">// step 01</span>
    <span class="n">ch_ExtractText</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>       <span class="c">// step 02</span>
    <span class="n">ch_ExtractPages</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>      <span class="c">// step 03</span>
    <span class="n">ch_GeneratePng</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>       <span class="c">// step 04</span>
    <span class="n">ch_GenerateLight</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>     <span class="c">// step 05</span>
    <span class="n">ch_GenerateDark</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>      <span class="c">// step 06</span>
    <span class="n">ch_ConvertToJpg</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>      <span class="c">// step 07</span>
    <span class="n">ch_PerformOcr</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>        <span class="c">// step 08</span>
    <span class="n">ch_AnalyzeText</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>       <span class="c">// step 09</span>
    <span class="n">ch_AnalyzeCryptonyms</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span> <span class="c">// step 10</span>
    <span class="n">ch_CompletedPage</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>     <span class="c">// step 11</span>
    <span class="n">ch_CompiledDocument</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>  <span class="c">// step 12</span>

    <span class="n">fmt</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Completed running in %d"</span><span class="p">,</span> <span class="n">time</span><span class="o">.</span><span class="n">Since</span><span class="p">(</span><span class="n">startedAt</span><span class="p">))</span>

    <span class="c">// excluded pid termination lines L333-L351</span>
<span class="p">}</span>
</code></pre>

</div>



<p>The binary is designed to support being compiled and executed in a universal format that supports macOS, Linux and Windows natively allowing you compile an <em>Apario Database</em> directory on any system that has the downstream dependencies defined. Getting everything working on Windows is extremely hard and I have not successfully tested it without using WSL2. In that case, the binary is compiled for Linux and not Windows, and is not an <code>.exe</code> - but Go allows you to compile this program into an <code>.exe</code> and run it - even if its not recommended 🤣.</p>

<p>What I hope you noticed was the 12 step process here 👀:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="n">ch_ImportedRow</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>       <span class="c">// step 01</span>
<span class="n">ch_ExtractText</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>       <span class="c">// step 02</span>
<span class="n">ch_ExtractPages</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>      <span class="c">// step 03</span>
<span class="n">ch_GeneratePng</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>       <span class="c">// step 04</span>
<span class="n">ch_GenerateLight</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>     <span class="c">// step 05</span>
<span class="n">ch_GenerateDark</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>      <span class="c">// step 06</span>
<span class="n">ch_ConvertToJpg</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>      <span class="c">// step 07</span>
<span class="n">ch_PerformOcr</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>        <span class="c">// step 08</span>
<span class="n">ch_AnalyzeText</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>       <span class="c">// step 09</span>
<span class="n">ch_AnalyzeCryptonyms</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span> <span class="c">// step 10</span>
<span class="n">ch_CompletedPage</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>     <span class="c">// step 11</span>
<span class="n">ch_CompiledDocument</span><span class="o">.</span><span class="n">Close</span><span class="p">()</span>  <span class="c">// step 12</span>
</code></pre>

</div>



<p>This exposes the <strong>actual pipeline</strong> of what the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">writer</a> actually does.</p>

<p><strong>FIRST:</strong> You begin with a CSV file or an XLSX file that contains the following type of data: </p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>RECORDNO</th>
<th>TITLE</th>
<th>URL</th>
<th>PATH</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>&lt;string&gt;</code></td>
<td><code>&lt;string&gt;</code></td>
<td><code>&lt;string&gt;</code></td>
<td><code>&lt;string&gt;</code></td>
</tr>
<tr>
<td>R1</td>
<td>Example Title</td>
<td><a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">https://archive.gov/example.pdf</a></td>
<td>./ingest/example.pdf</td>
</tr>
</tbody>
</table></div>

<p>This assumes that you have <code>./ingest</code> as a directory in the same location as the <code>writer</code> binary in this example - but you get what I am doing here. That <strong>PATH</strong> is local to the machine running the <em>writer</em>. The <strong>URL</strong> is the <em>original source</em> that <strong>should</strong> end in <code>.gov</code> or <code>.mil</code> if its going to be <em>authentic OSINT</em> that the PhoenixVault was originally built to serve. However, it's actually <em>not required</em>. You can use URLs like <code>https://mywebsite.com/assets/example.pdf</code> and the interface will use whatever link you provided in the column. This is so your users can see the original document in its original location - perhaps to verify authenticity - perhaps to compare results. The <strong>RECORDNO</strong> column is a <em>unique-required</em> string field. Some OSINT releases provide reference identifiers, and this <code>&lt;string&gt;</code> field is designed for <em>that value.</em></p>

<p>What <strong>writer</strong> does, is take this <code>.csv</code> or <code>.xlsx</code> (sheet 1 only) result and use these 4 columns in the CLI flags when the writer runs. Depending on which technology you're using, the flags change. Let's see what usage would look like based on these two type of ingestion file types. First lets get the source code of the writer on our machine.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code><span class="nb">mkdir</span> <span class="nt">-p</span> ~/workspace/projectapario
<span class="nb">cd</span> ~/workspace/projectapario
git clone git@github.com:ProjectApario/writer.git 
<span class="nb">cd </span>writer
<span class="nb">mkdir</span> <span class="nt">-p</span> bin
go build <span class="nt">-o</span> bin/writer <span class="nb">.</span>
<span class="nb">chmod</span> +x bin/writer
<span class="nb">sudo mv </span>bin/writer /usr/local/bin/writer
which writer
<span class="nb">mkdir</span> <span class="nt">-p</span> ingest <span class="c"># place PDFs in this folder</span>
<span class="nb">touch </span>ingest.csv <span class="c"># populate with your documents metadata</span>
</code></pre>

</div>



<p>Now, lets run it with a <strong>CSV</strong> file called <code>ingest.csv</code> and a directory of PDFs called <code>ingest</code> exists next to <code>bin</code>. These are the registered flag definitions:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="c">// Import .csv collections</span>
<span class="n">flag_s_import_csv</span>               <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">NewString</span><span class="p">(</span><span class="s">"import-csv"</span><span class="p">,</span> <span class="s">""</span><span class="p">,</span> <span class="s">"relative path to an excel spreadsheet where output is a comma separated table of urls and metadata properties. use additional args to associate columns to key data points."</span><span class="p">)</span>
<span class="n">flag_s_csv_column_url</span>           <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">NewString</span><span class="p">(</span><span class="s">"csv-column-url"</span><span class="p">,</span> <span class="s">""</span><span class="p">,</span> <span class="s">"value of row 1 whose column correlates to URLs to download PDF files from"</span><span class="p">)</span>
<span class="n">flag_s_csv_column_path</span>          <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">NewString</span><span class="p">(</span><span class="s">"csv-column-path"</span><span class="p">,</span> <span class="s">""</span><span class="p">,</span> <span class="s">"value of row 1 whose column correlates to absolute paths of PDF files"</span><span class="p">)</span>
<span class="n">flag_s_csv_column_record_number</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">NewString</span><span class="p">(</span><span class="s">"csv-column-record-number"</span><span class="p">,</span> <span class="s">""</span><span class="p">,</span> <span class="s">"value of row 1 whose column correlates to a unique record identifier or number"</span><span class="p">)</span>
<span class="n">flag_s_csv_column_title</span>         <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">NewString</span><span class="p">(</span><span class="s">"csv-column-title"</span><span class="p">,</span> <span class="s">""</span><span class="p">,</span> <span class="s">"value of row 1 whose column correlates to the title of the document"</span><span class="p">)</span>
<span class="n">flag_s_pdf_metadata_json</span>        <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">NewString</span><span class="p">(</span><span class="s">"metadata-json"</span><span class="p">,</span> <span class="s">""</span><span class="p">,</span> <span class="s">"json key value map[string]string"</span><span class="p">)</span>
</code></pre>

</div>



<p>Using it is as simple as:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>writer <span class="se">\ </span><span class="c"># CSV flags 👇🏻</span>
       <span class="nt">-import-csv</span> ./ingest.csv <span class="se">\</span>
       <span class="nt">-csv-column-url</span> URL <span class="se">\</span>
       <span class="nt">-csv-column-path</span> PATH <span class="se">\</span>
       <span class="nt">-csv-column-record-number</span> RECORDNO <span class="se">\</span>
       <span class="nt">-csv-column-title</span> TITLE <span class="se">\</span>
       <span class="nt">-metadata-json</span> <span class="s2">"{</span><span class="se">\"</span><span class="s2">collection</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">JFK Files</span><span class="se">\"</span><span class="s2">}"</span>
</code></pre>

</div>



<p>It looks identical for <strong>XLSX</strong> with the slight change.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>writer <span class="se">\ </span><span class="c"># XLSX flags 👇🏻</span>
       <span class="nt">-import-csv</span> ./ingest.xlsx <span class="se">\</span>
       <span class="nt">-xlsx-column-url</span> URL <span class="se">\</span>
       <span class="nt">-xlsx-column-path</span> PATH <span class="se">\</span>
       <span class="nt">-xlsx-column-record-number</span> RECORDNO <span class="se">\</span>
       <span class="nt">-xlsx-column-title</span> TITLE <span class="se">\</span>
       <span class="nt">-metadata-json</span> <span class="s2">"{</span><span class="se">\"</span><span class="s2">collection</span><span class="se">\"</span><span class="s2">: </span><span class="se">\"</span><span class="s2">JFK Files</span><span class="se">\"</span><span class="s2">}"</span>
</code></pre>

</div>



<p>Each <strong>row in the CSV</strong> is gathered into a <code>struct {}</code> and then passed into the <code>ch_ImportedRow</code> channel for processing. What we're doing, is going from a <strong>row in the CSV</strong> to a <strong>compiled JSON record object for the entire processed document</strong> and store that file in a structured directory that the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">reader</a> ingests by determinatively looking into a path as a <em>structured <code>Apario Database</code> that is a directory of files</em>.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="c">// start a bunch of receiver functions to handle when data is ready to be processed</span>
<span class="c">// each of these functions are like black boxes that ONE PAGE from a document is ingested into until it reaches the end</span>
</code></pre>

</div>



<p>At this point, we need to go back to the <code>main.go</code> file and look at how each of these channels are established.</p>

<p>As each <strong>row from the CSV or XSLX</strong> is passed into the writer itself, the actual setup of this channel is found in <code>data.go</code> of the project, but in <code>main()</code> I spawned <strong>goroutines</strong> for each of the pipeline steps. Traditionally, <strong>goroutines</strong> are for smaller tasks and such, but they can also be used for longer running tasks too. </p>

<p><strong>The <code>ch_ImportedRow</code> Channel</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">go</span> <span class="n">receiveImportedRow</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">ch_ImportedRow</span><span class="o">.</span><span class="n">Chan</span><span class="p">())</span>            <span class="c">// step 01 - runs validate_result_data_record before sending into ch_ExtractText</span>
</code></pre>

</div>



<p>The actual receiver function uses a <code>for { select {} }</code> pattern in Go to listen on the <code>context.Context</code>'s <code>.Done()</code> channel and the incoming <code>&lt;-ch</code> that is an <code>interface{}</code> data type (anything).<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">func</span> <span class="n">receiveImportedRow</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">ch</span> <span class="o">&lt;-</span><span class="k">chan</span> <span class="k">interface</span><span class="p">{})</span> <span class="p">{</span>
    <span class="k">var</span> <span class="n">err</span> <span class="kt">error</span>
    <span class="k">for</span> <span class="p">{</span>
        <span class="k">select</span> <span class="p">{</span>
        <span class="k">case</span> <span class="o">&lt;-</span><span class="n">ctx</span><span class="o">.</span><span class="n">Done</span><span class="p">()</span><span class="o">:</span>
            <span class="k">return</span>
        <span class="k">case</span> <span class="n">ird</span><span class="p">,</span> <span class="n">ok</span> <span class="o">:=</span> <span class="o">&lt;-</span><span class="n">ch</span><span class="o">:</span>
            <span class="k">if</span> <span class="n">ok</span> <span class="p">{</span>
                <span class="n">rd</span><span class="p">,</span> <span class="n">valid</span> <span class="o">:=</span> <span class="n">ird</span><span class="o">.</span><span class="p">(</span><span class="n">ResultData</span><span class="p">)</span>
                <span class="k">if</span> <span class="o">!</span><span class="n">valid</span> <span class="p">{</span>
                    <span class="n">log_error</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"not valid typecasting for ird to rd.(ResultData)"</span><span class="p">)</span>
                    <span class="k">return</span>
                <span class="p">}</span> <span class="c">// endif</span>
                <span class="n">rd</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">validate_result_data_record</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">rd</span><span class="p">)</span>
                <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
                    <span class="n">log_error</span><span class="o">.</span><span class="n">Tracef</span><span class="p">(</span><span class="s">"received error on validate_result_data_record for rd.URL %v ; err = %v"</span><span class="p">,</span> <span class="n">rd</span><span class="o">.</span><span class="n">URL</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
                <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                    <span class="n">log_info</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"validated the downloaded PDF %v from URL %v, sending rd into ch_ExtractText"</span><span class="p">,</span> <span class="n">filepath</span><span class="o">.</span><span class="n">Base</span><span class="p">(</span><span class="n">rd</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">),</span> <span class="n">rd</span><span class="o">.</span><span class="n">URL</span><span class="p">)</span>
                    <span class="k">if</span> <span class="n">ch_ExtractText</span><span class="o">.</span><span class="n">CanWrite</span><span class="p">()</span> <span class="p">{</span>
                        <span class="n">err</span> <span class="o">:=</span> <span class="n">ch_ExtractText</span><span class="o">.</span><span class="n">Write</span><span class="p">(</span><span class="n">rd</span><span class="p">)</span>
                        <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
                            <span class="n">log_error</span><span class="o">.</span><span class="n">Tracef</span><span class="p">(</span><span class="s">"failed to write to ch_ExtractText channel due to error: %v"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
                            <span class="k">return</span>
                        <span class="p">}</span> <span class="c">// end if</span>
                    <span class="p">}</span> <span class="c">// end if</span>
                <span class="p">}</span> <span class="c">// end if-else</span>
            <span class="p">}</span> <span class="c">// end if ok</span>
        <span class="p">}</span> <span class="c">// end select</span>
    <span class="p">}</span> <span class="c">// end for</span>
<span class="p">}</span> <span class="c">// end func</span>
</code></pre>

</div>



<p>This pattern is used throughout each of the steps. The resource intensive task in this case is called in the middle of this receiver function.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="n">rd</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">validate_result_data_record</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">rd</span><span class="p">)</span>
</code></pre>

</div>



<p>When we look into this function, located inside of the <code>pipeline.go</code> file, we can see:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">func</span> <span class="n">validate_result_data_record</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">record</span> <span class="n">ResultData</span><span class="p">)</span> <span class="p">(</span><span class="n">ResultData</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">log_info</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"started validate_result_data_record(%v) = %v"</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">Identifier</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">)</span>
    <span class="c">// analyze, repair on error, then re-analyze if necessary</span>
    <span class="n">pdf_info</span><span class="p">,</span> <span class="n">analyze_err</span> <span class="o">:=</span> <span class="n">analyze_then_repair_pdf</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">analyze_err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">record</span><span class="p">,</span> <span class="n">log_error</span><span class="o">.</span><span class="n">TraceReturn</span><span class="p">(</span><span class="n">analyze_err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="c">// fix total pages</span>
    <span class="k">if</span> <span class="n">pdf_info</span><span class="o">.</span><span class="n">Infos</span> <span class="o">!=</span> <span class="no">nil</span> <span class="o">&amp;&amp;</span> <span class="n">pdf_info</span><span class="o">.</span><span class="n">Infos</span><span class="p">[</span><span class="m">0</span><span class="p">]</span><span class="o">.</span><span class="n">Pages</span> <span class="o">==</span> <span class="m">0</span> <span class="o">&amp;&amp;</span> <span class="n">pdf_info</span><span class="o">.</span><span class="n">Infos</span><span class="p">[</span><span class="m">0</span><span class="p">]</span><span class="o">.</span><span class="n">Pages</span> <span class="o">!=</span> <span class="n">pdf_info</span><span class="o">.</span><span class="n">Infos</span><span class="p">[</span><span class="m">0</span><span class="p">]</span><span class="o">.</span><span class="n">PageCount</span> <span class="p">{</span>
        <span class="n">pdf_info</span><span class="o">.</span><span class="n">Infos</span><span class="p">[</span><span class="m">0</span><span class="p">]</span><span class="o">.</span><span class="n">Pages</span> <span class="o">=</span> <span class="n">pdf_info</span><span class="o">.</span><span class="n">Infos</span><span class="p">[</span><span class="m">0</span><span class="p">]</span><span class="o">.</span><span class="n">PageCount</span>
    <span class="p">}</span>
    <span class="c">// validate total pages</span>
    <span class="k">if</span> <span class="n">pdf_info</span><span class="o">.</span><span class="n">Infos</span><span class="p">[</span><span class="m">0</span><span class="p">]</span><span class="o">.</span><span class="n">Pages</span> <span class="o">==</span> <span class="m">0</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">record</span><span class="p">,</span> <span class="n">log_error</span><span class="o">.</span><span class="n">TraceReturnf</span><span class="p">(</span><span class="s">"failed to set pdf_info.Pages to pdf_info.PageCount</span><span class="se">\n</span><span class="s">pdf_info = %+v"</span><span class="p">,</span> <span class="n">pdf_info</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="c">// validate pdf</span>
    <span class="n">validate_err</span> <span class="o">:=</span> <span class="n">validate_pdf</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">validate_err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">record</span><span class="p">,</span> <span class="n">log_error</span><span class="o">.</span><span class="n">TraceReturn</span><span class="p">(</span><span class="n">validate_err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="c">// optimize pdf</span>
    <span class="n">optimize_err</span> <span class="o">:=</span> <span class="n">optimize_pdf</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">optimize_err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">record</span><span class="p">,</span> <span class="n">log_error</span><span class="o">.</span><span class="n">TraceReturn</span><span class="p">(</span><span class="n">optimize_err</span><span class="p">)</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">record</span><span class="p">,</span> <span class="no">nil</span>
<span class="p">}</span>
</code></pre>

</div>



<p>Here we're running <code>analyze_then_repair_pdf</code> then using the metadata from the result of the call to populate some structured data. Then we call the <code>validate_pdf</code> to confirm, then <code>optimize_pdf</code>. When we have a problem, we're using the <code>verbose.TraceReturn</code> directly as the <code>log_error</code> handler that is a <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">verbose</a> logger with secrets protection and stack trace analysis capabilities.  These can spawn child processes and take several seconds to complete depending on the size of the PDF file being analyzed. If it's gigabytes in size, like this writer has processed successfully, then it'll take a few minutes to complete. That's normal. In the <code>info_log</code> you'll see the begin and end time per document and you'll see some documents take several minutes to complete. This means that the pipeline built within the writer is capable of managing many system resources on a bare metal machine, utilize 100% of its capabilities while safely managing resources across the system that include spawned projects where some are single threaded, and some are multi-threaded. When a multi-threaded <code>tesseract</code> process is spawning, the writer has semaphores in place to ensure that its not going to use too many system resources and that <code>tesseract</code> is contained within a lane of processing compute power proportional to the impact that the pipeline has on the greater runtime.</p>

<p><strong>The <code>ch_ExtractText</code> Channel</strong></p>

<p>This is step 2 of the pipeline where we have to use a third party binary in order to extract the text out of the PDF. I didn't want to reinvent the wheel - I wanted to ingest 666K pages of JFK files as fast as possible, and if the tool works and its license is compatible, let's go!<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">go</span> <span class="n">receiveOnExtractTextCh</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">ch_ExtractText</span><span class="o">.</span><span class="n">Chan</span><span class="p">())</span>        <span class="c">// step 02 - runs extractPlainTextFromPdf before sending into ch_ExtractPages</span>
</code></pre>

</div>





<div class="highlight js-code-highlight">
<pre class="highlight go"><code>
<span class="k">func</span> <span class="n">receiveOnExtractTextCh</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">ch</span> <span class="o">&lt;-</span><span class="k">chan</span> <span class="k">interface</span><span class="p">{})</span> <span class="p">{</span>
    <span class="k">for</span> <span class="p">{</span>
        <span class="k">select</span> <span class="p">{</span>
        <span class="k">case</span> <span class="o">&lt;-</span><span class="n">ctx</span><span class="o">.</span><span class="n">Done</span><span class="p">()</span><span class="o">:</span>
            <span class="k">return</span>
        <span class="k">case</span> <span class="n">ird</span><span class="p">,</span> <span class="n">ok</span> <span class="o">:=</span> <span class="o">&lt;-</span><span class="n">ch</span><span class="o">:</span>
            <span class="k">if</span> <span class="n">ok</span> <span class="p">{</span>
                <span class="n">rd</span><span class="p">,</span> <span class="n">ok</span> <span class="o">:=</span> <span class="n">ird</span><span class="o">.</span><span class="p">(</span><span class="n">ResultData</span><span class="p">)</span>
                <span class="k">if</span> <span class="o">!</span><span class="n">ok</span> <span class="p">{</span>
                    <span class="n">log_error</span><span class="o">.</span><span class="n">Tracef</span><span class="p">(</span><span class="s">"failed to assert the ird from ch_ExtractText as type ResultData"</span><span class="p">)</span>
                    <span class="k">return</span>
                <span class="p">}</span>
                <span class="n">log_info</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"received rd from ch_ExtractText for URL %v, running extractPlainTextFromPdf(%v)"</span><span class="p">,</span> <span class="n">rd</span><span class="o">.</span><span class="n">URL</span><span class="p">,</span> <span class="n">rd</span><span class="o">.</span><span class="n">Identifier</span><span class="p">)</span>
                <span class="k">go</span> <span class="n">extractPlainTextFromPdf</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">rd</span><span class="p">)</span>
            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="n">log_debug</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"ch_ExtractText is closed but received some data"</span><span class="p">)</span>
                <span class="k">return</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre>

</div>



<p>Here you can see that the bulk of the processing takes place in the <code>go extractPlainTextFromPdf(ctx, rd)</code> spawning of another <strong>goroutine</strong>; in this case, we aren't going to wait for it in this particular loop of <code>receiveOnExtractTextCh</code>'s <code>for { select {} }</code> lifecycle until the <code>context.Context</code> is canceled. That context is then passed into the <code>extractPlainTextFromPdf</code>, where an external tool is invoked.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">func</span> <span class="n">extractPlainTextFromPdf</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">record</span> <span class="n">ResultData</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">defer</span> <span class="k">func</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">log_info</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"finished extracting the text from the PDF %v, now sending rd into ch_ExtractPages"</span><span class="p">,</span> <span class="n">filepath</span><span class="o">.</span><span class="n">Base</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">))</span>
        <span class="k">if</span> <span class="n">ch_ExtractPages</span><span class="o">.</span><span class="n">CanWrite</span><span class="p">()</span> <span class="p">{</span>
            <span class="n">err</span> <span class="o">:=</span> <span class="n">ch_ExtractPages</span><span class="o">.</span><span class="n">Write</span><span class="p">(</span><span class="n">record</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
                <span class="n">log_error</span><span class="o">.</span><span class="n">Tracef</span><span class="p">(</span><span class="s">"failed to write record %v into the ch_ExtractPages due to error %v"</span><span class="p">,</span> <span class="n">record</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}()</span>
    <span class="n">log_info</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"started extractPlainTextFromPdf(%v) = %v"</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">Identifier</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">ok</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">fileHasData</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">ExtractedTextPath</span><span class="p">);</span> <span class="o">!</span><span class="n">ok</span> <span class="o">||</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
        <span class="c">/*
            pdftotext REPLACE_WITH_FILE_PATH REPLACE_WITH_TEXT_OUTPUT_FILE_PATH
        */</span>
        <span class="n">cmd_extract_text_pdf</span> <span class="o">:=</span> <span class="n">exec</span><span class="o">.</span><span class="n">Command</span><span class="p">(</span><span class="n">m_required_binaries</span><span class="p">[</span><span class="s">"pdftotext"</span><span class="p">],</span> <span class="n">record</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">ExtractedTextPath</span><span class="p">)</span>
        <span class="k">var</span> <span class="n">cmd4_extract_text_pdf_stdout</span> <span class="n">bytes</span><span class="o">.</span><span class="n">Buffer</span>
        <span class="k">var</span> <span class="n">cmd4_extract_text_pdf_stderr</span> <span class="n">bytes</span><span class="o">.</span><span class="n">Buffer</span>
        <span class="n">cmd_extract_text_pdf</span><span class="o">.</span><span class="n">Stdout</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">cmd4_extract_text_pdf_stdout</span>
        <span class="n">cmd_extract_text_pdf</span><span class="o">.</span><span class="n">Stderr</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">cmd4_extract_text_pdf_stderr</span>
        <span class="n">sem_pdftotext</span><span class="o">.</span><span class="n">Acquire</span><span class="p">()</span>
        <span class="n">cmd_extract_text_pdf_err</span> <span class="o">:=</span> <span class="n">cmd_extract_text_pdf</span><span class="o">.</span><span class="n">Run</span><span class="p">()</span>
        <span class="n">sem_pdftotext</span><span class="o">.</span><span class="n">Release</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">cmd_extract_text_pdf_err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
            <span class="n">log_error</span><span class="o">.</span><span class="n">Tracef</span><span class="p">(</span><span class="s">"Failed to execute command `pdftotext %v %v` due to error: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">ExtractedTextPath</span><span class="p">,</span> <span class="n">cmd_extract_text_pdf_err</span><span class="p">)</span>
            <span class="k">return</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre>

</div>



<p>This uses the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">semaphore</a> package in order to <code>.Acquire()</code> and <code>.Release()</code> on an invocation of <code>.Run()</code> from an <code>exec.Command</code> on the required <code>m_required_binaries["pdftotext"]</code> <strong>pdftotext</strong> binary invocation. We're going to use a <code>bytes.Buffer</code> to collect on <code>STDOUT</code> and <code>STDERR</code> from the child process and we're using a semaphore to control <em>how many times</em> this particular function is allowed to be called <em>system wide</em> while <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">writer</a> compiles.</p>

<p><strong>The <code>ch_ExtractPages</code> Channel</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">go</span> <span class="n">receiveOnExtractPagesCh</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">ch_ExtractPages</span><span class="o">.</span><span class="n">Chan</span><span class="p">())</span>      <span class="c">// step 03 - runs extractPagesFromPdf before sending PendingPage into ch_GeneratePng</span>
</code></pre>

</div>





<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">func</span> <span class="n">receiveOnExtractPagesCh</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">ch</span> <span class="o">&lt;-</span><span class="k">chan</span> <span class="k">interface</span><span class="p">{})</span> <span class="p">{</span>
    <span class="k">for</span> <span class="p">{</span>
        <span class="k">select</span> <span class="p">{</span>
        <span class="k">case</span> <span class="o">&lt;-</span><span class="n">ctx</span><span class="o">.</span><span class="n">Done</span><span class="p">()</span><span class="o">:</span>
            <span class="k">return</span>
        <span class="k">case</span> <span class="n">ird</span><span class="p">,</span> <span class="n">ok</span> <span class="o">:=</span> <span class="o">&lt;-</span><span class="n">ch</span><span class="o">:</span>
            <span class="k">if</span> <span class="n">ok</span> <span class="p">{</span>
                <span class="n">rd</span><span class="p">,</span> <span class="n">ok</span> <span class="o">:=</span> <span class="n">ird</span><span class="o">.</span><span class="p">(</span><span class="n">ResultData</span><span class="p">)</span>
                <span class="k">if</span> <span class="o">!</span><span class="n">ok</span> <span class="p">{</span>
                    <span class="n">log_error</span><span class="o">.</span><span class="n">Tracef</span><span class="p">(</span><span class="s">"ch_ExtractPages receive an ird but cannot cast it as a .(ResultData) type"</span><span class="p">)</span>
                    <span class="k">return</span>
                <span class="p">}</span>
                <span class="n">log_info</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"received on ch_ExtractPages URL %v, running extractPagesFromPdf(%v)"</span><span class="p">,</span> <span class="n">rd</span><span class="o">.</span><span class="n">URL</span><span class="p">,</span> <span class="n">rd</span><span class="o">.</span><span class="n">Identifier</span><span class="p">)</span>
                <span class="k">go</span> <span class="n">extractPagesFromPdf</span><span class="p">(</span><span class="n">ctx</span><span class="p">,</span> <span class="n">rd</span><span class="p">)</span>
            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="n">log_debug</span><span class="o">.</span><span class="n">Trace</span><span class="p">(</span><span class="s">"ch_ExtractPages is closed but received some data"</span><span class="p">)</span>
                <span class="k">return</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre>

</div>



<p>This function is quite large. Let's look at it and then talk about it.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">func</span> <span class="n">extractPagesFromPdf</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">record</span> <span class="n">ResultData</span><span class="p">)</span> <span class="p">{</span>
   <span class="n">log_info</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"started extractPagesFromPdf(%v) = %v"</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">Identifier</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">)</span>
   <span class="c">/*
      pdfcpu extract -mode page REPLACE_WITH_FILE_PATH REPLACE_WITH_OUTPUT_DIRECTORY
   */</span>
   <span class="n">pagesDir</span> <span class="o">:=</span> <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">DataDir</span><span class="p">,</span> <span class="s">"pages"</span><span class="p">)</span>
   <span class="n">sm_page_directories</span><span class="o">.</span><span class="n">Store</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">Identifier</span><span class="p">,</span> <span class="n">pagesDir</span><span class="p">)</span>
   <span class="n">_</span><span class="p">,</span> <span class="n">pagesDirExistsErr</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">Stat</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">)</span>
   <span class="n">performPagesExtract</span> <span class="o">:=</span> <span class="no">false</span>
   <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">IsNotExist</span><span class="p">(</span><span class="n">pagesDirExistsErr</span><span class="p">)</span> <span class="p">{</span>
      <span class="n">performPagesExtract</span> <span class="o">=</span> <span class="no">true</span>
   <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
      <span class="n">ok</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">DirHasPDFs</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">)</span>
      <span class="k">if</span> <span class="n">err</span> <span class="o">==</span> <span class="no">nil</span> <span class="o">&amp;&amp;</span> <span class="n">ok</span> <span class="p">{</span>
         <span class="n">performPagesExtract</span> <span class="o">=</span> <span class="no">true</span>
      <span class="p">}</span>
   <span class="p">}</span>
<span class="n">RETRY</span><span class="o">:</span>
   <span class="k">if</span> <span class="n">performPagesExtract</span> <span class="p">{</span>
      <span class="n">pagesDirErr</span> <span class="o">:=</span> <span class="n">os</span><span class="o">.</span><span class="n">MkdirAll</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="m">0755</span><span class="p">)</span>
      <span class="k">if</span> <span class="n">pagesDirErr</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
         <span class="n">log_error</span><span class="o">.</span><span class="n">Tracef</span><span class="p">(</span><span class="s">"failed to create directory %v due to error %v"</span><span class="p">,</span> <span class="n">pagesDir</span><span class="p">,</span> <span class="n">pagesDirErr</span><span class="p">)</span>
         <span class="k">return</span>
      <span class="p">}</span>
      <span class="n">cmd_extract_pages_in_pdf</span> <span class="o">:=</span> <span class="n">exec</span><span class="o">.</span><span class="n">Command</span><span class="p">(</span><span class="n">m_required_binaries</span><span class="p">[</span><span class="s">"pdfcpu"</span><span class="p">],</span> <span class="s">"extract"</span><span class="p">,</span> <span class="s">"-mode"</span><span class="p">,</span> <span class="s">"page"</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">,</span> <span class="n">pagesDir</span><span class="p">)</span>
      <span class="k">var</span> <span class="n">cmd_extract_pages_in_pdf_stdout</span> <span class="n">bytes</span><span class="o">.</span><span class="n">Buffer</span>
      <span class="k">var</span> <span class="n">cmd_extract_pages_in_pdf_stderr</span> <span class="n">bytes</span><span class="o">.</span><span class="n">Buffer</span>
      <span class="n">cmd_extract_pages_in_pdf</span><span class="o">.</span><span class="n">Stdout</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">cmd_extract_pages_in_pdf_stdout</span>
      <span class="n">cmd_extract_pages_in_pdf</span><span class="o">.</span><span class="n">Stderr</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">cmd_extract_pages_in_pdf_stderr</span>
      <span class="n">sem_pdfcpu</span><span class="o">.</span><span class="n">Acquire</span><span class="p">()</span>
      <span class="n">cmd_extract_pages_in_pdf_err</span> <span class="o">:=</span> <span class="n">cmd_extract_pages_in_pdf</span><span class="o">.</span><span class="n">Run</span><span class="p">()</span>
      <span class="n">sem_pdfcpu</span><span class="o">.</span><span class="n">Release</span><span class="p">()</span>
      <span class="k">if</span> <span class="n">cmd_extract_pages_in_pdf_err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
         <span class="n">log_error</span><span class="o">.</span><span class="n">Tracef</span><span class="p">(</span><span class="s">"Failed to execute command `pdfcpu extract -mode page %v %v` due to error: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">,</span> <span class="n">pagesDir</span><span class="p">,</span> <span class="n">cmd_extract_pages_in_pdf_err</span><span class="p">)</span>
         <span class="k">return</span>
      <span class="p">}</span>
   <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
      <span class="n">log_info</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"not performing `pdfcpu extrace -mode page %v %v` because the directory %v already has PDFs inside it"</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">PDFPath</span><span class="p">,</span> <span class="n">pagesDir</span><span class="p">,</span> <span class="n">pagesDir</span><span class="p">)</span>
      <span class="n">check</span> <span class="o">:=</span> <span class="nb">len</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">)</span>

      <span class="k">if</span> <span class="n">check</span> <span class="p">{</span>
         <span class="k">goto</span> <span class="n">RETRY</span>
      <span class="p">}</span>
   <span class="p">}</span>

   <span class="n">pagesDirWalkErr</span> <span class="o">:=</span> <span class="n">filepath</span><span class="o">.</span><span class="n">Walk</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="k">func</span><span class="p">(</span><span class="n">path</span> <span class="kt">string</span><span class="p">,</span> <span class="n">info</span> <span class="n">os</span><span class="o">.</span><span class="n">FileInfo</span><span class="p">,</span> <span class="n">err</span> <span class="kt">error</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
      <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
         <span class="n">log_error</span><span class="o">.</span><span class="n">Tracef</span><span class="p">(</span><span class="s">"Error accessing a path %q: %v</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">path</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
         <span class="k">return</span> <span class="n">err</span>
      <span class="p">}</span>

      <span class="k">if</span> <span class="o">!</span><span class="n">info</span><span class="o">.</span><span class="n">IsDir</span><span class="p">()</span> <span class="o">&amp;&amp;</span> <span class="n">strings</span><span class="o">.</span><span class="n">HasSuffix</span><span class="p">(</span><span class="n">info</span><span class="o">.</span><span class="n">Name</span><span class="p">(),</span> <span class="s">".pdf"</span><span class="p">)</span> <span class="p">{</span>
         <span class="n">nameParts</span> <span class="o">:=</span> <span class="n">strings</span><span class="o">.</span><span class="n">Split</span><span class="p">(</span><span class="n">info</span><span class="o">.</span><span class="n">Name</span><span class="p">(),</span> <span class="s">"_page_"</span><span class="p">)</span>
         <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">nameParts</span><span class="p">)</span> <span class="o">&lt;</span> <span class="m">2</span> <span class="p">{</span>
            <span class="k">return</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Errorf</span><span class="p">(</span><span class="s">"incorrect filename provided as %v"</span><span class="p">,</span> <span class="n">info</span><span class="o">.</span><span class="n">Name</span><span class="p">())</span>
         <span class="p">}</span>
         <span class="n">pgNoStr</span> <span class="o">:=</span> <span class="n">strings</span><span class="o">.</span><span class="n">ReplaceAll</span><span class="p">(</span><span class="n">nameParts</span><span class="p">[</span><span class="m">1</span><span class="p">],</span> <span class="s">".pdf"</span><span class="p">,</span> <span class="s">""</span><span class="p">)</span>
         <span class="n">pgNo</span><span class="p">,</span> <span class="n">pgNoErr</span> <span class="o">:=</span> <span class="n">strconv</span><span class="o">.</span><span class="n">Atoi</span><span class="p">(</span><span class="n">pgNoStr</span><span class="p">)</span>
         <span class="k">if</span> <span class="n">pgNoErr</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
            <span class="k">return</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Errorf</span><span class="p">(</span><span class="s">"failed to extract the pgNo from the PDF filename %v"</span><span class="p">,</span> <span class="n">info</span><span class="o">.</span><span class="n">Name</span><span class="p">())</span>
         <span class="p">}</span>
         <span class="n">identifier</span> <span class="o">:=</span> <span class="n">NewIdentifier</span><span class="p">(</span><span class="m">9</span><span class="p">)</span>
         <span class="n">pp</span> <span class="o">:=</span> <span class="n">PendingPage</span><span class="p">{</span>
            <span class="n">Identifier</span><span class="o">:</span>       <span class="n">identifier</span><span class="p">,</span>
            <span class="n">RecordIdentifier</span><span class="o">:</span> <span class="n">record</span><span class="o">.</span><span class="n">Identifier</span><span class="p">,</span>
            <span class="n">PageNumber</span><span class="o">:</span>       <span class="n">pgNo</span><span class="p">,</span>
            <span class="n">PagesDir</span><span class="o">:</span>         <span class="n">pagesDir</span><span class="p">,</span>
            <span class="n">PDFPath</span><span class="o">:</span>          <span class="n">path</span><span class="p">,</span>
            <span class="n">OCRTextPath</span><span class="o">:</span>      <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"ocr.%06d.txt"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
            <span class="n">ManifestPath</span><span class="o">:</span>     <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.%06d.json"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
            <span class="n">PNG</span><span class="o">:</span> <span class="n">PNG</span><span class="p">{</span>
               <span class="n">Light</span><span class="o">:</span> <span class="n">Images</span><span class="p">{</span>
                  <span class="n">Original</span><span class="o">:</span> <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.light.%06d.original.png"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Large</span><span class="o">:</span>    <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.light.%06d.large.png"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Medium</span><span class="o">:</span>   <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.light.%06d.medium.png"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Small</span><span class="o">:</span>    <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.light.%06d.small.png"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Social</span><span class="o">:</span>   <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.light.%06d.social.png"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
               <span class="p">},</span>
               <span class="n">Dark</span><span class="o">:</span> <span class="n">Images</span><span class="p">{</span>
                  <span class="n">Original</span><span class="o">:</span> <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.dark.%06d.original.png"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Large</span><span class="o">:</span>    <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.dark.%06d.large.png"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Medium</span><span class="o">:</span>   <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.dark.%06d.medium.png"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Small</span><span class="o">:</span>    <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.dark.%06d.small.png"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Social</span><span class="o">:</span>   <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.dark.%06d.social.png"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
               <span class="p">},</span>
            <span class="p">},</span>
            <span class="n">JPEG</span><span class="o">:</span> <span class="n">JPEG</span><span class="p">{</span>
               <span class="n">Light</span><span class="o">:</span> <span class="n">Images</span><span class="p">{</span>
                  <span class="n">Original</span><span class="o">:</span> <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.light.%06d.original.jpg"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Large</span><span class="o">:</span>    <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.light.%06d.large.jpg"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Medium</span><span class="o">:</span>   <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.light.%06d.medium.jpg"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Small</span><span class="o">:</span>    <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.light.%06d.small.jpg"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Social</span><span class="o">:</span>   <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.light.%06d.social.jpg"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
               <span class="p">},</span>
               <span class="n">Dark</span><span class="o">:</span> <span class="n">Images</span><span class="p">{</span>
                  <span class="n">Original</span><span class="o">:</span> <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.dark.%06d.original.jpg"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Large</span><span class="o">:</span>    <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.dark.%06d.large.jpg"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Medium</span><span class="o">:</span>   <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.dark.%06d.medium.jpg"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Small</span><span class="o">:</span>    <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.dark.%06d.small.jpg"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
                  <span class="n">Social</span><span class="o">:</span>   <span class="n">filepath</span><span class="o">.</span><span class="n">Join</span><span class="p">(</span><span class="n">pagesDir</span><span class="p">,</span> <span class="n">fmt</span><span class="o">.</span><span class="n">Sprintf</span><span class="p">(</span><span class="s">"page.dark.%06d.social.jpg"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">)),</span>
               <span class="p">},</span>
            <span class="p">},</span>
         <span class="p">}</span>
         <span class="n">sm_pages</span><span class="o">.</span><span class="n">Store</span><span class="p">(</span><span class="n">pp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">,</span> <span class="n">pp</span><span class="p">)</span>
         <span class="n">err</span> <span class="o">:=</span> <span class="n">WritePendingPageToJson</span><span class="p">(</span><span class="n">pp</span><span class="p">)</span>
         <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
            <span class="k">return</span> <span class="n">err</span>
         <span class="p">}</span>
         <span class="n">log_info</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"sending page %d (ID %v) from record %v URL %v into the ch_GeneratingPng"</span><span class="p">,</span> <span class="n">pgNo</span><span class="p">,</span> <span class="n">identifier</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">Identifier</span><span class="p">,</span> <span class="n">record</span><span class="o">.</span><span class="n">URL</span><span class="p">)</span>
         <span class="k">if</span> <span class="n">ch_GeneratePng</span><span class="o">.</span><span class="n">CanWrite</span><span class="p">()</span> <span class="p">{</span>
            <span class="n">err</span> <span class="o">:=</span> <span class="n">ch_GeneratePng</span><span class="o">.</span><span class="n">Write</span><span class="p">(</span><span class="n">pp</span><span class="p">)</span>
            <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
               <span class="n">log_error</span><span class="o">.</span><span class="n">Tracef</span><span class="p">(</span><span class="s">"cannot send pp into ch_GeneratePng channel due to error %v"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
               <span class="k">return</span> <span class="n">err</span>
            <span class="p">}</span>
         <span class="p">}</span>
      <span class="p">}</span>

      <span class="k">return</span> <span class="no">nil</span>
   <span class="p">})</span>

   <span class="k">if</span> <span class="n">pagesDirWalkErr</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
      <span class="n">log_error</span><span class="o">.</span><span class="n">Tracef</span><span class="p">(</span><span class="s">"Error walking the path ./pages: %v</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">pagesDirWalkErr</span><span class="p">)</span>
      <span class="k">return</span>
   <span class="p">}</span>

   <span class="k">return</span>
<span class="p">}</span>
</code></pre>

</div>



<p>You can see <code>RETRY:</code> and <code>goto RETRY</code>? Well, thats a way of recursively calling a block within the function until something works - without having to deal with invoking and tearing down functions in between. In the case of recursion, I'm simply using the <code>performPagesExtract</code> as a variable to determine whether or not we should even consider using <code>goto RETRY</code>. When <code>performPagesExtract</code> is false, I <em>reconsider what if true?</em> If true, that means that the check passes and we actually <em>did need to run it</em> but we didn't have something we needed first - so we fix that - and then re-run it. </p>

<p>Next what I do is I build out a <code>PendingPage{}</code> struct with a bunch of metadata about the <strong>individual page</strong> from the given document. This is performed by using <code>filepath.Walk(pagesDir, &lt;walkFunc&gt; {})</code> invocation on the output of the previous command that took the PDF file and extracted in a sub-directory one PDF per page in the original file. We're going to iterate over those compiled documents now, and we're going to populate this <code>PendingPage{}</code> record with the gathered metadata about this particular <em>page</em>. </p>

<p>We're using semaphores here, and we're also invoking <code>WritePendingPageToJson(pp)</code>, which effectively compiles the <em>Apario Database</em> from scratch by writing individual JSON files to structured locations based on the page analysis output. </p>

<p>I could go into each of the channels and break them down - but they are very similar in structure to what we have just explored from start to finish. What felt like a short ride, can be a journey of discovery by studying the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">writer</a> and either utilizing it for public service or contributing to its long-term stability.</p>

<p>The writer is responsible for ingesting a CSV file that can have as many as 72K rows of records inside of it that contain 666K pages of OSINT in unsearchable manner. </p>

<p>The full text analysis uses <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">textee</a> and <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">gematria</a> in order to take the OCR extract text, or the PDF's containing text and break sentences like:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>The lazy brown dog jumps over the quick fox.
</code></pre>

</div>



<p>Into:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>The (2)
The lazy (1)
The lazy brown (1)
lazy (1)
lazy brown (1)
lazy brown dog (1)
brown (1)
brown dog (1)
brown dog jumps (1)
dog (1)
dog jumps (1)
dog jumps over (1)
jumps (1)
jumps over (1)
jumps over the (1)
over (1)
over the (1)
over the quick (1)
the quick (1)
the quick fox (1)
quick (1)
quick fox (1)
fox (1)
</code></pre>

</div>



<p>Notice the <code>The (2)</code> and the way that between <code>over the quick (1)</code> and <code>the quick (1)</code> we omit <code>the (1)</code> by making the first <code>The</code> a 2. That's what <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">textee</a> does.</p>

<p>The <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">gematria</a> package is responsible for calculating the Simple, English, Jewish, Eights, Majestic and Mystery values.</p>

<p>The pipeline operates in this manner: </p>

<ol>
<li>Rows from a CSV are ingested</li>
<li>PDF is scanned, analyzed, optimized and rendered into a directory of individual page PDF files</li>
<li>Each page PDF file is individually processed - keeping track of its original directory and original extracted document</li>
<li>The <code>.pdf</code> is converted into a <code>.png</code>
</li>
<li>The <code>.png</code> is compiled into a progressive light JPEG</li>
<li>The <code>.png</code> is converted into dark mode</li>
<li>The dark mode <code>.png</code> is compiled into a progressive dark JPEG</li>
<li>The <code>.pdf</code> is processed through <code>pdftotext</code> to extract text</li>
<li>The <code>.pdf</code> is processed through <code>tesseract</code> to extract text</li>
<li>The extracted text is analyzed against <strong>7 regular expressions</strong> to find <em>dates</em> and <em>cryptonyms</em>
</li>
<li>The <code>PendingPage{}</code> struct is passed into <code>aggregatePendingPage</code> in the <code>aggregate.go</code> file</li>
</ol>

<p>When the dates are analyzed, I opted to use regular expressions for it as defined in the <code>data.go</code> file:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="n">re_date1</span> <span class="o">=</span> <span class="n">regexp</span><span class="o">.</span><span class="n">MustCompile</span><span class="p">(</span><span class="s">`(?i)(\d{1,2})(st|nd|rd|th)?\s(?:of\s)?(January|Jan|February|Feb|March|Mar|April|Apr|May|June|Jun|July|Jul|August|Aug|September|Sep|October|Oct|November|Nov|December|Dec),?\s(\d{2,4})`</span><span class="p">)</span>

<span class="n">re_date2</span> <span class="o">=</span> <span class="n">regexp</span><span class="o">.</span><span class="n">MustCompile</span><span class="p">(</span><span class="s">`(?i)(\d{1,2})\/(\d{1,2})\/(\d{2,4})`</span><span class="p">)</span>

<span class="n">re_date3</span> <span class="o">=</span> <span class="n">regexp</span><span class="o">.</span><span class="n">MustCompile</span><span class="p">(</span><span class="s">`(?i)(January|Jan|February|Feb|March|Mar|April|Apr|May|June|Jun|July|Jul|August|Aug|September|Sep|October|Oct|November|Nov|December|Dec),?\s(\d{2,4})`</span><span class="p">)</span>

<span class="n">re_date5</span> <span class="o">=</span> <span class="n">regexp</span><span class="o">.</span><span class="n">MustCompile</span><span class="p">(</span><span class="s">`(?i)(January|Jan|February|Feb|March|Mar|April|Apr|May|June|Jun|July|Jul|August|Aug|September|Sep|October|Oct|November|Nov|December|Dec)\s(\d{1,2})(st|nd|rd|th)?,?\s(\d{2,4})`</span><span class="p">)</span>

<span class="n">re_date4</span> <span class="o">=</span> <span class="n">regexp</span><span class="o">.</span><span class="n">MustCompile</span><span class="p">(</span><span class="s">`(?i)(January|Jan|February|Feb|March|Mar|April|Apr|May|June|Jun|July|Jul|August|Aug|September|Sep|October|Oct|November|Nov|December|Dec)\s(\d{4})`</span><span class="p">)</span>

<span class="n">re_date6</span> <span class="o">=</span> <span class="n">regexp</span><span class="o">.</span><span class="n">MustCompile</span><span class="p">(</span><span class="s">`(\d{4})`</span><span class="p">)</span>
</code></pre>

</div>



<p>Then inside of <code>dates.go</code> I am consuming them like so:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="n">match1</span> <span class="o">:=</span> <span class="n">re_date1</span><span class="o">.</span><span class="n">FindAllStringSubmatch</span><span class="p">(</span><span class="n">in</span><span class="p">,</span> <span class="o">-</span><span class="m">1</span><span class="p">)</span>

<span class="n">match2</span> <span class="o">:=</span> <span class="n">re_date2</span><span class="o">.</span><span class="n">FindAllStringSubmatch</span><span class="p">(</span><span class="n">in</span><span class="p">,</span> <span class="o">-</span><span class="m">1</span><span class="p">)</span>

<span class="n">match3</span> <span class="o">:=</span> <span class="n">re_date3</span><span class="o">.</span><span class="n">FindAllStringSubmatch</span><span class="p">(</span><span class="n">in</span><span class="p">,</span> <span class="o">-</span><span class="m">1</span><span class="p">)</span>

<span class="n">match4</span> <span class="o">:=</span> <span class="n">re_date4</span><span class="o">.</span><span class="n">FindAllStringSubmatch</span><span class="p">(</span><span class="n">in</span><span class="p">,</span> <span class="o">-</span><span class="m">1</span><span class="p">)</span>

<span class="n">match5</span> <span class="o">:=</span> <span class="n">re_date5</span><span class="o">.</span><span class="n">FindAllStringSubmatch</span><span class="p">(</span><span class="n">in</span><span class="p">,</span> <span class="o">-</span><span class="m">1</span><span class="p">)</span>

<span class="n">match6</span> <span class="o">:=</span> <span class="n">re_date6</span><span class="o">.</span><span class="n">FindAllStringSubmatch</span><span class="p">(</span><span class="n">in</span><span class="p">,</span> <span class="o">-</span><span class="m">1</span><span class="p">)</span>
</code></pre>

</div>



<p>Since <em>time</em> is an illusion and we have multiple types, we can look at:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="n">day</span><span class="p">,</span> <span class="n">dayErr</span> <span class="o">:=</span> <span class="n">strconv</span><span class="o">.</span><span class="n">Atoi</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="err">?</span><span class="p">])</span>

<span class="n">month</span> <span class="o">:=</span> <span class="n">getMonthFromString</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="err">?</span><span class="p">])</span>
<span class="n">month</span><span class="p">,</span> <span class="n">_</span> <span class="o">:=</span> <span class="n">strconv</span><span class="o">.</span><span class="n">Atoi</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="err">?</span><span class="p">])</span>

<span class="n">year</span><span class="p">,</span> <span class="n">yearErr</span> <span class="o">:=</span> <span class="n">strconv</span><span class="o">.</span><span class="n">Atoi</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="err">?</span><span class="p">])</span>
</code></pre>

</div>



<p>I conclude analyzing each of these matches with this function:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">func</span> <span class="n">uniqueTimes</span><span class="p">(</span><span class="n">times</span> <span class="p">[]</span><span class="n">time</span><span class="o">.</span><span class="n">Time</span><span class="p">)</span> <span class="p">[]</span><span class="n">time</span><span class="o">.</span><span class="n">Time</span> <span class="p">{</span>
    <span class="n">seen</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">(</span><span class="k">map</span><span class="p">[</span><span class="n">time</span><span class="o">.</span><span class="n">Time</span><span class="p">]</span><span class="kt">bool</span><span class="p">)</span>
    <span class="k">var</span> <span class="n">unique</span> <span class="p">[]</span><span class="n">time</span><span class="o">.</span><span class="n">Time</span>
    <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">t</span> <span class="o">:=</span> <span class="k">range</span> <span class="n">times</span> <span class="p">{</span>
        <span class="k">if</span> <span class="n">t</span><span class="o">.</span><span class="n">Year</span><span class="p">()</span> <span class="o">&lt;</span> <span class="m">1800</span> <span class="o">||</span> <span class="n">t</span><span class="o">.</span><span class="n">Year</span><span class="p">()</span> <span class="o">&gt;</span> <span class="n">time</span><span class="o">.</span><span class="n">Now</span><span class="p">()</span><span class="o">.</span><span class="n">Year</span><span class="p">()</span> <span class="p">{</span>
            <span class="k">continue</span>
        <span class="p">}</span>
        <span class="n">t</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">Date</span><span class="p">(</span><span class="n">t</span><span class="o">.</span><span class="n">Year</span><span class="p">(),</span> <span class="n">t</span><span class="o">.</span><span class="n">Month</span><span class="p">(),</span> <span class="n">t</span><span class="o">.</span><span class="n">Day</span><span class="p">(),</span> <span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="m">0</span><span class="p">,</span> <span class="n">t</span><span class="o">.</span><span class="n">Location</span><span class="p">())</span>
        <span class="k">if</span> <span class="n">_</span><span class="p">,</span> <span class="n">ok</span> <span class="o">:=</span> <span class="n">seen</span><span class="p">[</span><span class="n">t</span><span class="p">];</span> <span class="o">!</span><span class="n">ok</span> <span class="p">{</span>
            <span class="n">unique</span> <span class="o">=</span> <span class="nb">append</span><span class="p">(</span><span class="n">unique</span><span class="p">,</span> <span class="n">t</span><span class="p">)</span>
            <span class="n">seen</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="no">true</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">unique</span>
<span class="p">}</span>
</code></pre>

</div>



<h3>
  
  
  Aggregating <code>PendingPage {}</code> In Pipeline
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">func</span> <span class="n">aggregatePendingPage</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="o">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">pp</span> <span class="n">PendingPage</span><span class="p">)</span> <span class="p">{</span>
   <span class="n">data_rd</span><span class="p">,</span> <span class="n">result_data_found</span> <span class="o">:=</span> <span class="n">sm_resultdatas</span><span class="o">.</span><span class="n">Load</span><span class="p">(</span><span class="n">pp</span><span class="o">.</span><span class="n">RecordIdentifier</span><span class="p">)</span>
   <span class="c">// process missing from sync.Map</span>

   <span class="n">rd</span><span class="p">,</span> <span class="n">rd_cast_ok</span> <span class="o">:=</span> <span class="n">data_rd</span><span class="o">.</span><span class="p">(</span><span class="n">ResultData</span><span class="p">)</span>
   <span class="c">// process invalid ResultData cast</span>

   <span class="n">document_data</span><span class="p">,</span> <span class="n">document_found</span> <span class="o">:=</span> <span class="n">sm_documents</span><span class="o">.</span><span class="n">Load</span><span class="p">(</span><span class="n">pp</span><span class="o">.</span><span class="n">RecordIdentifier</span><span class="p">)</span>
   <span class="c">// process missing from sync.Map</span>

   <span class="n">document</span><span class="p">,</span> <span class="n">document_cast_ok</span> <span class="o">:=</span> <span class="n">document_data</span><span class="o">.</span><span class="p">(</span><span class="n">Document</span><span class="p">)</span>
   <span class="c">// process invalid Document cast</span>

   <span class="c">// print document page count results</span>

   <span class="n">mu</span> <span class="o">:=</span> <span class="n">DocumentLocker</span><span class="p">(</span><span class="n">document</span><span class="o">.</span><span class="n">Identifier</span><span class="p">)</span>
   <span class="n">mu</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
   <span class="k">if</span> <span class="n">document</span><span class="o">.</span><span class="n">Pages</span> <span class="o">==</span> <span class="no">nil</span> <span class="p">{</span>
      <span class="n">document</span><span class="o">.</span><span class="n">Pages</span> <span class="o">=</span> <span class="nb">make</span><span class="p">(</span><span class="k">map</span><span class="p">[</span><span class="kt">int64</span><span class="p">]</span><span class="n">Page</span><span class="p">)</span>
   <span class="p">}</span>
   <span class="n">document</span><span class="o">.</span><span class="n">Pages</span><span class="p">[</span><span class="kt">int64</span><span class="p">(</span><span class="n">pp</span><span class="o">.</span><span class="n">PageNumber</span><span class="p">)]</span> <span class="o">=</span> <span class="n">Page</span><span class="p">{</span>
      <span class="n">Identifier</span><span class="o">:</span>         <span class="n">pp</span><span class="o">.</span><span class="n">Identifier</span><span class="p">,</span>
      <span class="n">DocumentIdentifier</span><span class="o">:</span> <span class="n">pp</span><span class="o">.</span><span class="n">RecordIdentifier</span><span class="p">,</span>
      <span class="n">PageNumber</span><span class="o">:</span>         <span class="kt">int64</span><span class="p">(</span><span class="n">pp</span><span class="o">.</span><span class="n">PageNumber</span><span class="p">),</span>
   <span class="p">}</span>
   <span class="k">defer</span> <span class="n">mu</span><span class="o">.</span><span class="n">Unlock</span><span class="p">()</span>
   <span class="n">ticker</span> <span class="o">:=</span> <span class="n">time</span><span class="o">.</span><span class="n">NewTicker</span><span class="p">(</span><span class="m">333</span> <span class="o">*</span> <span class="n">time</span><span class="o">.</span><span class="n">Millisecond</span><span class="p">)</span>
   <span class="n">timer</span> <span class="o">:=</span> <span class="n">time</span><span class="o">.</span><span class="n">NewTimer</span><span class="p">(</span><span class="m">999</span> <span class="o">*</span> <span class="n">time</span><span class="o">.</span><span class="n">Second</span><span class="p">)</span>
   <span class="k">if</span> <span class="kt">int64</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">document</span><span class="o">.</span><span class="n">Pages</span><span class="p">))</span> <span class="o">==</span> <span class="n">document</span><span class="o">.</span><span class="n">TotalPages</span> <span class="p">{</span>
      <span class="k">for</span> <span class="p">{</span>
         <span class="k">select</span> <span class="p">{</span>
         <span class="k">case</span> <span class="o">&lt;-</span><span class="n">ctx</span><span class="o">.</span><span class="n">Done</span><span class="p">()</span><span class="o">:</span>
            <span class="n">log_debug</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"context canceled on aggregatePendingPage %+v"</span><span class="p">,</span> <span class="n">pp</span><span class="p">)</span>
            <span class="k">return</span>
         <span class="k">case</span> <span class="o">&lt;-</span><span class="n">timer</span><span class="o">.</span><span class="n">C</span><span class="o">:</span>
            <span class="n">log_error</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"FATAL TO DOCUMENT aggregatePendingPage failed to ingest %+v into the ch_CompiledDocument"</span><span class="p">,</span> <span class="n">pp</span><span class="p">)</span>
            <span class="k">return</span>
         <span class="k">case</span> <span class="o">&lt;-</span><span class="n">ticker</span><span class="o">.</span><span class="n">C</span><span class="o">:</span>
            <span class="n">err</span> <span class="o">:=</span> <span class="n">ch_CompiledDocument</span><span class="o">.</span><span class="n">Write</span><span class="p">(</span><span class="n">document</span><span class="p">)</span>
            <span class="n">log_info</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"ch_CompiledDocument.CanWrite = %v"</span><span class="p">,</span> <span class="n">ch_CompiledDocument</span><span class="o">.</span><span class="n">CanWrite</span><span class="p">())</span>
            <span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="no">nil</span> <span class="p">{</span>
               <span class="n">log_error</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"FATAL TO DOCUMENT - err in writing to channel: %v"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
            <span class="p">}</span>
            <span class="k">return</span>
         <span class="p">}</span>
      <span class="p">}</span>
   <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
      <span class="n">log_debug</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"aggregatePendingPage document %v page %d received but the document.Pages are at %d of %d so waiting before sending into ch_CompiledDocument"</span><span class="p">,</span>
         <span class="n">pp</span><span class="o">.</span><span class="n">RecordIdentifier</span><span class="p">,</span> <span class="n">pp</span><span class="o">.</span><span class="n">PageNumber</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">document</span><span class="o">.</span><span class="n">Pages</span><span class="p">),</span> <span class="n">document</span><span class="o">.</span><span class="n">TotalPages</span><span class="p">)</span>
   <span class="p">}</span>
   <span class="k">return</span>
<span class="p">}</span>
</code></pre>

</div>



<p>As you can see, we're using a <code>sync.Map</code> called <code>sm_resultdatas.Load(pp.RecordIdentifier)</code> in order to retrieve the <code>PendingPage{}</code> struct out of memory according to the <strong>RECORDNO</strong> column from the original <strong>CSV</strong> or <strong>XLSX</strong> file. </p>

<p>We're using the <code>DocumentLocker</code> in order to safely write to <code>document.Pages[int64(pp.PageNumber)]</code> in a concurrent multi-threaded environment where resources are shared across threads and child processes.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">type</span> <span class="n">Document</span> <span class="k">struct</span> <span class="p">{</span>
    <span class="n">Identifier</span>          <span class="kt">string</span>         <span class="s">`json:"identifier"`</span>
    <span class="n">URL</span>                 <span class="kt">string</span>         <span class="s">`json:"url"`</span>
    <span class="n">Pages</span>               <span class="k">map</span><span class="p">[</span><span class="kt">int64</span><span class="p">]</span><span class="n">Page</span> <span class="s">`json:"pages"`</span>
    <span class="n">TotalPages</span>          <span class="kt">int64</span>          <span class="s">`json:"total_pages"`</span>
    <span class="n">CoverPageIdentifier</span> <span class="kt">string</span>         <span class="s">`json:"cover_page_identifier"`</span>
    <span class="n">Collection</span>          <span class="n">Collection</span>     <span class="s">`json:"collection"`</span>
<span class="p">}</span>

<span class="k">type</span> <span class="n">Page</span> <span class="k">struct</span> <span class="p">{</span>
    <span class="n">Identifier</span>         <span class="kt">string</span>            <span class="s">`json:"identifier"`</span>
    <span class="n">DocumentIdentifier</span> <span class="kt">string</span>            <span class="s">`json:"document_identifier"`</span>
    <span class="n">PageNumber</span>         <span class="kt">int64</span>             <span class="s">`json:"page_number"`</span>
    <span class="n">Metadata</span>           <span class="k">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kt">string</span> <span class="s">`json:"metadata"`</span>
    <span class="n">FullTextGematria</span>   <span class="n">gem</span><span class="o">.</span><span class="n">Gematria</span>      <span class="s">`json:"full_text_gematria"`</span>
    <span class="n">FullText</span>           <span class="kt">string</span>            <span class="s">`json:"full_text"`</span>
<span class="p">}</span>
</code></pre>

</div>



<p>The lockers are defined in the <code>lockers.go</code> file, and the <code>init()</code> func is what I want to point your attention to next.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">func</span> <span class="n">init</span><span class="p">()</span> <span class="p">{</span>
    <span class="c">// Checksums</span>
    <span class="n">cslMu</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">sync</span><span class="o">.</span><span class="n">RWMutex</span><span class="p">{}</span>
    <span class="n">checksumLockers</span> <span class="o">=</span> <span class="nb">make</span><span class="p">(</span><span class="k">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="o">*</span><span class="n">sync</span><span class="o">.</span><span class="n">RWMutex</span><span class="p">)</span>

    <span class="c">// Documents</span>
    <span class="n">dlMu</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">sync</span><span class="o">.</span><span class="n">RWMutex</span><span class="p">{}</span>
    <span class="n">documentLockers</span> <span class="o">=</span> <span class="nb">make</span><span class="p">(</span><span class="k">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="o">*</span><span class="n">sync</span><span class="o">.</span><span class="n">RWMutex</span><span class="p">)</span>

    <span class="c">// Pages</span>
    <span class="n">pageLockers</span> <span class="o">=</span> <span class="nb">make</span><span class="p">(</span><span class="k">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="o">*</span><span class="n">sync</span><span class="o">.</span><span class="n">RWMutex</span><span class="p">)</span>
    <span class="n">plMu</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">sync</span><span class="o">.</span><span class="n">RWMutex</span><span class="p">{}</span>
<span class="p">}</span>
</code></pre>

</div>



<p>Here, we're registering a couple of <code>map[string]*sync.RWMutex</code> for the <code>documentLockers</code> and <code>pageLockers</code> in the package. </p>

<p>There are three types; the first is for checksums ; used to take the URL, generate a SHA512 string and use that as the <em>Apario Database</em> subdirectory to store the structured contents into. Rendered assets are stored here and JSON files written to disk live here. In order to treat the filesystem like this as a database, I needed to have various lockers. A <code>checksum</code> level locker - for work being done to the <em>root level</em> of the document record. The <code>DocumentLocker</code> for per ID records in the <strong>CSV</strong> or <strong>XLSX</strong> file ingested.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="c">// Document Locker</span>
<span class="k">var</span> <span class="n">dlMu</span> <span class="o">*</span><span class="n">sync</span><span class="o">.</span><span class="n">RWMutex</span>
<span class="k">var</span> <span class="n">documentLockers</span> <span class="k">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="o">*</span><span class="n">sync</span><span class="o">.</span><span class="n">RWMutex</span>
<span class="k">var</span> <span class="n">DocumentLocker</span> <span class="o">=</span> <span class="k">func</span><span class="p">(</span><span class="n">id</span> <span class="kt">string</span><span class="p">)</span> <span class="o">*</span><span class="n">sync</span><span class="o">.</span><span class="n">RWMutex</span> <span class="p">{</span>
    <span class="n">dlMu</span><span class="o">.</span><span class="n">Lock</span><span class="p">()</span>
    <span class="n">log</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"DocumentLocker(%s) Locked..."</span><span class="p">,</span> <span class="n">id</span><span class="p">)</span>
    <span class="k">defer</span> <span class="k">func</span><span class="p">()</span> <span class="p">{</span>
        <span class="n">log</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"... DocumentLocker(%s) Unlocked!"</span><span class="p">,</span> <span class="n">id</span><span class="p">)</span>
        <span class="n">dlMu</span><span class="o">.</span><span class="n">Unlock</span><span class="p">()</span>
    <span class="p">}()</span>
    <span class="k">if</span> <span class="n">_</span><span class="p">,</span> <span class="n">found</span> <span class="o">:=</span> <span class="n">documentLockers</span><span class="p">[</span><span class="n">id</span><span class="p">];</span> <span class="o">!</span><span class="n">found</span> <span class="p">{</span>
        <span class="n">documentLockers</span><span class="p">[</span><span class="n">id</span><span class="p">]</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">sync</span><span class="o">.</span><span class="n">RWMutex</span><span class="p">{}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">documentLockers</span><span class="p">[</span><span class="n">id</span><span class="p">]</span>
<span class="p">}</span>
</code></pre>

</div>



<p>The <code>DocumentLocker</code> variable <em>is a function</em> that intentionally can be overwritten with a new function of the same signature type. The <code>dlMu</code> is a <code>documentLockers</code>'s mutex, different from a <em>record's locker</em> defined as <code>documentLockers[id] = &amp;sync.RWMutex{}</code>. </p>

<p>This pattern allowed me to create lockers for pages that were dynamically belonging to documents in your original <strong>CSV</strong> or <strong>XLSX</strong> that was passed into the arguments of the writer when it executed.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">for</span> <span class="p">{</span>
   <span class="k">select</span> <span class="p">{</span>
   <span class="k">case</span> <span class="o">&lt;-</span><span class="n">ctx</span><span class="o">.</span><span class="n">Done</span><span class="p">()</span><span class="o">:</span>
      <span class="n">elapsed</span> <span class="o">:=</span> <span class="n">time</span><span class="o">.</span><span class="n">Since</span><span class="p">(</span><span class="n">startedAt</span><span class="p">)</span>
      <span class="n">log</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Completed task in %.0f seconds"</span><span class="p">,</span> <span class="n">elapsed</span><span class="o">.</span><span class="n">Seconds</span><span class="p">())</span>
      <span class="k">return</span>
   <span class="k">case</span> <span class="o">&lt;-</span><span class="n">ch_Done</span><span class="o">:</span>
      <span class="n">log</span><span class="o">.</span><span class="n">SetOutput</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">Stdout</span><span class="p">)</span>
      <span class="n">log</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"done processing everything... time to end things now!"</span><span class="p">)</span>
      <span class="n">watchdog</span> <span class="o">&lt;-</span> <span class="n">os</span><span class="o">.</span><span class="n">Kill</span>
   <span class="k">case</span> <span class="n">id</span><span class="p">,</span> <span class="n">ok</span> <span class="o">:=</span> <span class="o">&lt;-</span><span class="n">ch_CompiledDocument</span><span class="o">.</span><span class="n">Chan</span><span class="p">()</span><span class="o">:</span>
      <span class="k">if</span> <span class="n">ok</span> <span class="p">{</span>
         <span class="n">d</span><span class="p">,</span> <span class="n">ok</span> <span class="o">:=</span> <span class="n">id</span><span class="o">.</span><span class="p">(</span><span class="n">Document</span><span class="p">)</span>
         <span class="k">if</span> <span class="o">!</span><span class="n">ok</span> <span class="p">{</span>
            <span class="n">log_error</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"cannot typecast the final result for %s as a .(Document)"</span><span class="p">,</span> <span class="n">d</span><span class="o">.</span><span class="n">Identifier</span><span class="p">)</span>
         <span class="p">}</span>
         <span class="n">a_i_received_documents</span><span class="o">.</span><span class="n">Add</span><span class="p">(</span><span class="m">1</span><span class="p">)</span>
         <span class="n">log_info</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"a_i_total_documents == a_i_received_documents ; %d == %d"</span><span class="p">,</span>
            <span class="n">a_i_total_documents</span><span class="o">.</span><span class="n">Load</span><span class="p">(),</span> <span class="n">a_i_received_documents</span><span class="o">.</span><span class="n">Load</span><span class="p">())</span>

         <span class="k">if</span> <span class="n">a_i_total_documents</span><span class="o">.</span><span class="n">Load</span><span class="p">()</span> <span class="o">==</span> <span class="n">a_i_received_documents</span><span class="o">.</span><span class="n">Load</span><span class="p">()</span> <span class="p">{</span>
            <span class="n">log</span><span class="o">.</span><span class="n">SetOutput</span><span class="p">(</span><span class="n">os</span><span class="o">.</span><span class="n">Stdout</span><span class="p">)</span>
            <span class="n">log</span><span class="o">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"Completed processing document %v"</span><span class="p">,</span> <span class="n">d</span><span class="p">)</span>
            <span class="n">ch_Done</span> <span class="o">&lt;-</span> <span class="k">struct</span><span class="p">{}{}</span>
         <span class="p">}</span>
      <span class="p">}</span>
   <span class="p">}</span>
<span class="p">}</span>
</code></pre>

</div>



<p>I chose to end the <code>main()</code> func with a <code>for { select {} }</code> that listens on the background context's <code>.Done()</code> channel, the <code>ch_Done</code> channel being written to, or a new completed <strong>row from the CSV or XLSX</strong> is received compiled via <code>&lt;-ch_CompiledDocument.Chan()</code>.</p>

<p>I created a variable called <code>a_i_received_documents</code> to track the total received documents. The <code>a_</code> is for <strong>atomic</strong> and <code>i_</code> is for <strong>int</strong>, so the <code>atomic.Int</code> is called <em>received_documents</em> Once every row has been processed, the <code>struct{}{}</code> is written to the <code>ch_Done</code> channel. </p>

<p>If you've noticed the <code>.Chan()</code> throughout this, that is the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">smartchan</a> that I wrote.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">package</span> <span class="n">go_smartchan</span>

<span class="k">import</span> <span class="p">(</span>
    <span class="s">"errors"</span>
    <span class="s">`fmt`</span>
    <span class="s">"sync"</span>
    <span class="s">`sync/atomic`</span>
<span class="p">)</span>

<span class="k">type</span> <span class="n">SmartChan</span> <span class="k">struct</span> <span class="p">{</span>
    <span class="n">ch</span>     <span class="k">chan</span> <span class="k">interface</span><span class="p">{}</span>
    <span class="n">mu</span>     <span class="n">sync</span><span class="o">.</span><span class="n">RWMutex</span>
    <span class="n">closed</span> <span class="n">atomic</span><span class="o">.</span><span class="n">Bool</span>
    <span class="n">cnt</span>    <span class="n">atomic</span><span class="o">.</span><span class="n">Int64</span>
<span class="p">}</span>

<span class="k">func</span> <span class="n">NewSmartChan</span><span class="p">(</span><span class="n">i</span> <span class="kt">int</span><span class="p">)</span> <span class="o">*</span><span class="n">SmartChan</span> <span class="p">{}</span>

<span class="k">func</span> <span class="p">(</span><span class="n">sc</span> <span class="o">*</span><span class="n">SmartChan</span><span class="p">)</span> <span class="n">Write</span><span class="p">(</span><span class="n">thing</span> <span class="k">interface</span><span class="p">{})</span> <span class="p">(</span><span class="n">err</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{}</span>
<span class="k">func</span> <span class="p">(</span><span class="n">sc</span> <span class="o">*</span><span class="n">SmartChan</span><span class="p">)</span> <span class="n">Read</span><span class="p">()</span> <span class="p">(</span><span class="k">interface</span><span class="p">{},</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{}</span>
<span class="k">func</span> <span class="p">(</span><span class="n">sc</span> <span class="o">*</span><span class="n">SmartChan</span><span class="p">)</span> <span class="n">Count</span><span class="p">()</span> <span class="kt">int64</span> <span class="p">{}</span>
<span class="k">func</span> <span class="p">(</span><span class="n">sc</span> <span class="o">*</span><span class="n">SmartChan</span><span class="p">)</span> <span class="n">Close</span><span class="p">()</span> <span class="p">{}</span>
<span class="k">func</span> <span class="p">(</span><span class="n">sc</span> <span class="o">*</span><span class="n">SmartChan</span><span class="p">)</span> <span class="n">Chan</span><span class="p">()</span> <span class="k">chan</span> <span class="k">interface</span><span class="p">{}</span> <span class="p">{}</span>
<span class="k">func</span> <span class="p">(</span><span class="n">sc</span> <span class="o">*</span><span class="n">SmartChan</span><span class="p">)</span> <span class="n">CanWrite</span><span class="p">()</span> <span class="kt">bool</span> <span class="p">{}</span>
</code></pre>

</div>



<p>This is used throughout the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">writer</a> and throughout a bunch of other projects that I've worked with. Asking <code>.CanWrite()</code> on a channel is a task that allows you to build in pipelines when channels become unwritable and then writable. It attempts to remove the <code>panic()</code> from using channels in Go. </p>

<p>I didn't want to close out on the piece before walking you through some of the more complex AI generated functions that I did use. At this time, ChatGPT was the utility that I was using, and these functions served their purposes for what they were intended to perform. Given their open source nature, discussing them here is relevant to the context of this piece.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight go"><code><span class="k">func</span> <span class="n">nrgbaToRGBA</span><span class="p">(</span><span class="n">src</span> <span class="o">*</span><span class="n">image</span><span class="o">.</span><span class="n">NRGBA</span><span class="p">)</span> <span class="o">*</span><span class="n">image</span><span class="o">.</span><span class="n">RGBA</span> <span class="p">{</span>
   <span class="n">b</span> <span class="o">:=</span> <span class="n">src</span><span class="o">.</span><span class="n">Bounds</span><span class="p">()</span>
   <span class="n">dst</span> <span class="o">:=</span> <span class="n">image</span><span class="o">.</span><span class="n">NewRGBA</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>

   <span class="k">for</span> <span class="n">y</span> <span class="o">:=</span> <span class="n">b</span><span class="o">.</span><span class="n">Min</span><span class="o">.</span><span class="n">Y</span><span class="p">;</span> <span class="n">y</span> <span class="o">&lt;</span> <span class="n">b</span><span class="o">.</span><span class="n">Max</span><span class="o">.</span><span class="n">Y</span><span class="p">;</span> <span class="n">y</span><span class="o">++</span> <span class="p">{</span>
      <span class="k">for</span> <span class="n">x</span> <span class="o">:=</span> <span class="n">b</span><span class="o">.</span><span class="n">Min</span><span class="o">.</span><span class="n">X</span><span class="p">;</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">b</span><span class="o">.</span><span class="n">Max</span><span class="o">.</span><span class="n">X</span><span class="p">;</span> <span class="n">x</span><span class="o">++</span> <span class="p">{</span>
         <span class="n">r</span><span class="p">,</span> <span class="n">g</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span> <span class="o">:=</span> <span class="n">src</span><span class="o">.</span><span class="n">At</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span><span class="o">.</span><span class="n">RGBA</span><span class="p">()</span>

         <span class="c">// Convert from non-premultiplied to premultiplied alpha</span>
         <span class="n">r</span> <span class="o">=</span> <span class="p">(</span><span class="n">r</span> <span class="o">*</span> <span class="n">a</span><span class="p">)</span> <span class="o">/</span> <span class="m">0xffff</span>
         <span class="n">g</span> <span class="o">=</span> <span class="p">(</span><span class="n">g</span> <span class="o">*</span> <span class="n">a</span><span class="p">)</span> <span class="o">/</span> <span class="m">0xffff</span>
         <span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="n">b</span> <span class="o">*</span> <span class="n">a</span><span class="p">)</span> <span class="o">/</span> <span class="m">0xffff</span>

         <span class="n">dst</span><span class="o">.</span><span class="n">SetRGBA</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">color</span><span class="o">.</span><span class="n">RGBA</span><span class="p">{</span>
            <span class="n">R</span><span class="o">:</span> <span class="kt">uint8</span><span class="p">(</span><span class="n">r</span> <span class="o">&gt;&gt;</span> <span class="m">8</span><span class="p">),</span>
            <span class="n">G</span><span class="o">:</span> <span class="kt">uint8</span><span class="p">(</span><span class="n">g</span> <span class="o">&gt;&gt;</span> <span class="m">8</span><span class="p">),</span>
            <span class="n">B</span><span class="o">:</span> <span class="kt">uint8</span><span class="p">(</span><span class="n">b</span> <span class="o">&gt;&gt;</span> <span class="m">8</span><span class="p">),</span>
            <span class="n">A</span><span class="o">:</span> <span class="kt">uint8</span><span class="p">(</span><span class="n">a</span> <span class="o">&gt;&gt;</span> <span class="m">8</span><span class="p">),</span>
         <span class="p">})</span>
      <span class="p">}</span>
   <span class="p">}</span>

   <span class="k">return</span> <span class="n">dst</span>
<span class="p">}</span>
</code></pre>

</div>



<p>A little bot named Red lived in Paint Town. Red loved to help kids make their pictures look pretty!</p>

<p>One day, tiny Tim brought a clear sheet with colors on it. "I want to show my friends!" said Tim.</p>

<p>"I can help!" beeped Red. "Watch me make it pretty!"<br>
Red took a white paper and looked at each tiny spot on Tim's clear sheet.</p>

<p>"When I see light spots," beeped Red, "I make them soft like clouds."</p>

<p>"When I see bright spots," beeped Red, "I make them strong like rainbows!"</p>

<p>Spot by spot, Red made Tim's picture. Some colors were soft, some were bright!</p>

<p>"Wow!" smiled Tim. "Now my friends can see my picture too!"</p>

<p>Red did a happy beep-boop dance. Helping make pictures was Red's favorite thing!</p>

<p>The End.</p>
<h2>
  
  
  Conclusion
</h2>

<p>This application, the first of three in the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">Project Apario</a> trio of open source software takes a <code>.csv</code> or <code>.xlsx</code> (first sheet only) and processes the structured data <code>RECORDNO,TITLE,URL,PATH</code> into an <em>Apario Database</em> that the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">reader</a> renders into an ultra-fast self-contained web application called <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">PhoenixVault</a>. </p>

<p>The original project written was a <strong>Ruby on Rails</strong> implementation that was built on a Zoom call with a former Disney animator over a 17 day flow state. I have a witness for what I built. DJ watched me built the pipeline in Rails using sidekiq making each of the system calls for each of the steps. When I took a chance on myself over Christmas 2021 to rewrite the Rails implementation that was still costing me over $2,000 per month - even after removing all of the SaaS and going completely in-house private cloud for everything. This meant that I spent a year migrating the external SaaS model that used <strong>MongoDB Atlas</strong>, <strong>ElasticSearch As A Service</strong> called <em>ELK</em>, and <strong>DigitalOcean Managed Redis</strong> running behind a private cloud built behind ESXi and Rocky 9 Linux with SELinux enabled. I reduced my OPEX from $7K down to $2K per month. That comes out to a $180K savings over 3 years. I wasn't going to keep asking the American people to pay <em>me $180K</em> to keep the PhoenixVault online for you. Instead, what I built in the trio application, was a solution that can run on an OVH Bare Metal host for $33 per month.</p>

<p>It's simple. The $33/mo host is sufficient. When you get it, set it up like so:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>ssh <span class="nt">-i</span> ~/.ssh/mykey rocky@17.76.17.76 <span class="c"># replace with your IP address and replace ~/.ssh/mykey with your SSH key</span>
rocky@ip-17-76-17-76: 
</code></pre>

</div>



<p>Then you can set it up like so:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code><span class="nb">sudo mkdir</span> <span class="nt">-p</span> /apario/<span class="o">{</span>reader,writer,search<span class="o">}</span>/<span class="o">{</span>workspace,config,logs<span class="o">}</span>
</code></pre>

</div>



<p>Then you can do:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code><span class="nb">cd</span> /apario/reader
git clone git@github.com:ProjectApario/reader.git src

<span class="nb">cd</span> /apario/writer
git clone git@github.com:ProjectApario/writer.git src

<span class="nb">cd</span> /apario/search
git clone git@github.com:ProjectApario/search.git src 
</code></pre>

</div>



<p>Then you'll need to render a <strong>YAML</strong> script for each of the instances that you're running. If your project is called <code>acme-disclosure</code> then you're have:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>/apario/reader/src
/apario/writer/src
/apario/search/src
</code></pre>

</div>



<p>In addition to that, you'll also create a symbiotic relationship between:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>/apario/reader/acme-disclosure/database
</code></pre>

</div>



<p>and<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>/apario/writer/acme-disclosure/ingest
</code></pre>

</div>



<p>such that the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">writer</a> <strong>writes</strong> to the <code>/apario/reader/acme-disclosure/database</code> path and the <a href="https://tsecurity.de/weiterlesen/3665975/3694116/how-i-processed-666k-pages-of-flattened-pdfs-into-a-full-text-search-engine/" target="_blank" rel="noopener noreferrer">reader</a> <strong>reads</strong> the same path. The <strong>writer</strong> processes the <em>flattened or non-optimized PDFs</em> from the <code>/apario/writer/acme-disclosure/ingest</code>. </p>

<p>This is useful for <em>ACME</em> (a fictional company) to release a <em>disclosure</em> of information in the form of a PDF dump. It's common with documentation and with OSINT practices. For the context of the JFK files from the National Archives, I wrote the writer to ingest <em>those files</em> into a useable format that I ended up writing a consumer for. </p>

<p>This is the first of three binaries and the project is <em>incomplete</em> because of <em>life.</em> When the time comes to dust off what I have built and continue the torch, the time will come. Until that time arrives, I type to share what I learned so that the youth can pick up the torch. </p>

<p>The vision that I had as a child wasn't for me alone to experience. It was for the world to discover the beauty that dwells within and how technology helps us understand the complex reality that we live inside. 💜</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Should you use AI for a task? Here’s a simple way to decide | Bruce Schneier]]></title>
<description><![CDATA[Sometimes, what matters isn’t your output but what you put into the process. Think of it like work v the gymI teach public policy at the Harvard Kennedy School and the Munk School at the University of Toronto. And it will come as no surprise to you that my students regularly use AI to complete th...]]></description>
<link>https://tsecurity.de/de/3693080/it-nachrichten/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide-bruce-schneier/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3693080/it-nachrichten/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide-bruce-schneier/</guid>
<pubDate>Sat, 25 Jul 2026 06:11:43 +0200</pubDate>
<content:encoded><![CDATA[<p>Sometimes, what matters isn’t your output but what you put into the process. Think of it like work v the gym</p><p>I teach public policy at the Harvard Kennedy School and the Munk School at the University of Toronto. And it will come as no surprise to you that my students regularly <a href="https://tsecurity.de/weiterlesen/3664939/3693080/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide-bruce-schneier/" target="_blank" rel="noopener noreferrer">use AI</a> to complete their writing assignments. Doing so is a waste of their tuition money. But if their entire career is going to include AI writing assistants, why shouldn’t they embrace their future?</p><p>The best way I’ve found to explain the dilemma <a href="https://tsecurity.de/weiterlesen/3664939/3693080/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide-bruce-schneier/" target="_blank" rel="noopener noreferrer">comes from</a> the AI researcher Daniel Meissler: it’s the difference between work and the gym.</p> <a href="https://tsecurity.de/weiterlesen/3664939/3693080/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide-bruce-schneier/" target="_blank" rel="noopener noreferrer">Continue reading...</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[Reconstructing Pelé’s lost goal]]></title>
<description><![CDATA[Author: Google DeepMind - Bewertung: 9259x - Views:268224 On August 2, 1959, Pelé scored the most beautiful goal of his career: three consecutive “sombreros” without the ball touching the ground. Yet, the legendary ‘Gol da Rua Javari’ was never caught on film. We worked alongside historians, spor...]]></description>
<link>https://tsecurity.de/de/3692988/youtube-security-videos/reconstructing-pels-lost-goal/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3692988/youtube-security-videos/reconstructing-pels-lost-goal/</guid>
<pubDate>Sat, 25 Jul 2026 05:04:26 +0200</pubDate>
<content:encoded><![CDATA[<p>Author: Google DeepMind - Bewertung: 9259x - Views:268224 <br/></p><p><iframe id="ytplayer" loading="lazy" type="text/html" width="100%" height="auto" src="https://www.youtube.com/embed/R-Yqes8AotY?autoplay=1&origin=https://tsecurity.de" frameborder="0"></iframe></p><p>On August 2, 1959, Pelé scored the most beautiful goal of his career: three consecutive “sombreros” without the ball touching the ground. Yet, the legendary ‘Gol da Rua Javari’ was never caught on film. We worked alongside historians, sports journalists, football legends, and Pelé’s family to reconstruct this lost moment and share it with the world.<br />
<br />
This project was created in full partnership with the Pelé Brand, the official managers of the Pelé estate.<br />
<br />
Rooted in education and cultural preservation, the project heads to the Pelé Museum this year. To achieve this, teams from Google DeepMind used models like Gemini Omni and Veo to transform historical fragments into moving imagery, filmed on the original pitch with authentic uniforms and a vintage ball.<br />
<br />
By making the memory of this goal more accessible, it stands as a tribute to inspire a new generation of fans during the first World Cup without him.<br />
<br />
The goal is on display at the Museu Pelé in Santos, Brazil.<br />
<br />
Learn more at https://blog.google/innovation-and-ai/models-and-research/google-deepmind/pele-lost-goal-reconstructed<br />
<br />
___<br />
<br />
No dia 2 de agosto de 1959, Pelé marcou o gol mais bonito da sua carreira: três chapéus consecutivos, sem deixar a bola tocar no chão. No entanto, o famoso “Gol da Rua Javari” nunca foi filmado. Em um trabalho em conjunto com historiadores, jornalistas esportivos, lendas do futebol e familiares do Pelé, reconstruímos esse momento antológico do futebol para o mundo todo ver.<br />
<br />
Esse projeto foi criado em parceria com a marca Pelé, administradores oficiais do espólio do Rei Pelé.<br />
<br />
Com foco em educação e preservação cultural, o projeto segue para o Museu Pelé este ano. Para conseguir isso, equipes do Google DeepMind usaram modelos de IA como Gemini Omni e Veo, para transformar fragmentos históricos em filmes, usando filmagens no campo original com uniformes e bola da época.<br />
<br />
Tornar a memória desse gol acessível, é uma forma de homenagem, para inspirar as novas gerações de fãs de futebol, na primeira Copa do Mundo sem o Rei Pelé.<br />
<br />
O “Gol da Rua Javari” está em exibição no Museu Pelé, em Santos.<br />
<br />
Special thanks to:<br />
<br />
Flávia Kurtz, Walter Dias, Pepe, Neymar Jr., Marta, Mauro Beting, Vicente Romano Netto, Angelo Agarelli, Anita Lucchesi, Paulo Monteiro, Santos F.C., C.A. Juventus, NY Cosmos, Museu Pelé, Museu do Futebol<br />
<br />
Research: Arka<br />
Lead Researcher, Historian: Anita Lucchesi<br />
<br />
Production: The Youth<br />
Directors: Youth + Yuca<br />
<br />
NY &amp; SF Production: Feast<br />
AI Production: Special Guest X<br />
<br />
Editor: Bruno Lasevicius<br />
Post Production: Colossal<br />
<br />
Post Music and Sound: Satelite<br />
<br />
Music: <br />
“Magalenha”<br />
Performed by Sérgio Mendes<br />
Written by Carlinhos Brown<br />
Courtesy of Warner-Tamerlane Publishing Corp. (BMI) c/o Warner Chappell Music, Inc.<br />
and Concord Records, a Concord Label Group Release<br />
<br />
“Paraquedas”<br />
Written by Russo Passapusso<br />
Universal Mus. Publishing MGB Brasil Ltda. obo Máquina de Louco Ed. Mus. Ltda.<br />
<br />
___<br />
<br />
Subscribe to our channel https://www.youtube.com/@googledeepmind <br />
Find us on X https://x.com/GoogleDeepMind<br />
Follow us on Instagram https://instagram.com/googledeepmind <br />
Add us on Linkedin https://www.linkedin.com/company/deepmind/<br/></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Advancing AI 2026 Replay | Build What's Next with @AMD]]></title>
<description><![CDATA[Author: AMD - Bewertung: 14x - Views:94 Join AMD and Dr. Lisa Su at #AdvancingAI to experience the latest in AI infrastructure, architecture, and development. Get up to speed on the latest AI compute innovations from AMD and our enterprise partners. And hear from industry leaders building what’s ...]]></description>
<link>https://tsecurity.de/de/3692678/youtube-security-videos/advancing-ai-2026-replay-build-whats-next-with-amd/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3692678/youtube-security-videos/advancing-ai-2026-replay-build-whats-next-with-amd/</guid>
<pubDate>Sat, 25 Jul 2026 00:15:38 +0200</pubDate>
<content:encoded><![CDATA[<p>Author: AMD - Bewertung: 14x - Views:94 <br/></p><p><iframe id="ytplayer" loading="lazy" type="text/html" width="100%" height="auto" src="https://www.youtube.com/embed/8B_Gese-bdI?autoplay=1&origin=http://tsecurity.de" frameborder="0"></iframe></p><p>Join AMD and Dr. Lisa Su at #AdvancingAI to experience the latest in AI infrastructure, architecture, and development. Get up to speed on the latest AI compute innovations from AMD and our enterprise partners. And hear from industry leaders building what’s next in AI. <br />
<br />
Discover more: https://www.amd.com/en/corporate/events/advancing-ai.html<br />
<br />
00:00:00 Introduction<br />
00:01:22 Opening Video<br />
00:03:05 Welcome & Opening Keynote: Dr. Lisa Su, Chair and CEO, AMD<br />
00:22:20 Anthropic Partnership: Tom Brown, Co-founder & Chief Compute Officer, Anthropic<br />
00:31:36 OpenAI Partnership: Sachin Katti, Head of Infrastructure, OpenAI<br />
00:52:23 Meta AI Infrastructure: Santosh Janardhan, Head of Infrastructure, Meta<br />
01:02:44 Cerebras Systems: Andrew Feldman, Co-founder & CEO, Cerebras<br />
01:07:39 ROCm Software Platform: Vamsi Boppana, Senior Vice President, AI, AMD<br />
01:19:28 Phillipe Tillet, Member of technical staff, Open AI<br />
01:28:31 Enterprise AI Infrastructure: Dan McNamara, Senior Vice President & General Manager, Compute and Enterprise AI, AMD<br />
01:39:45 Jeremy Legg, Chief Technology officer, AT&T<br />
01:46:16 Jack Huynh, SVP & GM, Computing & Graphics, AMD<br />
01:54:59 Cisco Partnership: Jeetu Patel, President & Chief Product Officer, Cisco<br />
02:07:55 Closing Keynote & Future Vision: Dr. Lisa Su<br />
<br />
<br />
*Keynote presentation: https://www.amd.com/content/dam/amd/en/documents/corporate/events/advancing-ai-2026-distribution-deck.pdf<br />
<br />
***<br />
<br />
Subscribe: https://bit.ly/Subscribe_to_AMD <br />
Join the AMD Gaming Discord Server: https://discord.gg/amd-gaming<br />
Visit the AMD Gaming Community Website: https://www.amdgaming.com/<br />
Like us on Facebook: https://bit.ly/AMD_on_Facebook<br />
Follow us on Twitter: https://bit.ly/AMD_On_Twitter <br />
Follow us on Twitch: https://Twitch.tv/AMD <br />
Follow us on LinkedIn: https://bit.ly/AMD_on_Linkedin <br />
Follow us on Instagram: https://bit.ly/AMD_on_Instagram<br />
<br />
©2026 Advanced Micro Devices, Inc. AMD, the AMD Arrow Logo, and combinations thereof are trademarks of Advanced Micro Devices, Inc. in the United States and other jurisdictions. Other names are for informational purposes only and may be trademarks of their respective owners.<br/></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Astronomers May Have Discovered First Moon Outside Our Solar System]]></title>
<description><![CDATA[Astronomers studying the star system CD-35 2722 may have found the first known moon-like object outside our solar system. The classification is unusually tricky, however, because it orbits a brown dwarf rather than a planet, making it clearly an "exosatellite" but forcing scientists to rethink wh...]]></description>
<link>https://tsecurity.de/de/3691872/it-security-nachrichten/astronomers-may-have-discovered-first-moon-outside-our-solar-system/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3691872/it-security-nachrichten/astronomers-may-have-discovered-first-moon-outside-our-solar-system/</guid>
<pubDate>Fri, 24 Jul 2026 17:07:19 +0200</pubDate>
<content:encoded><![CDATA[Astronomers studying the star system CD-35 2722 may have found the first known moon-like object outside our solar system. The classification is unusually tricky, however, because it orbits a brown dwarf rather than a planet, making it clearly an "exosatellite" but forcing scientists to rethink where the line between planet, moon, and failed star should be drawn. Space.com reports: The star CD-35 2722 is located around 73 light-years away and has around half the mass of the sun. It is orbited by a "failed star" or brown dwarf. These stellar bodies get their unfortunate nickname because they form like other stars but fail to gather enough mass to trigger the fusion of hydrogen to helium in their cores. In terms of mass, brown dwarfs are more massive than the largest gas giant planets, but smaller than the smallest stars, usually with around 13 to 80 times the mass of Jupiter, or around 0.013 to 0.08 times the mass of the sun.
 
The newly discovered object in CD-35 2722 is certainly moon-like, but rather than orbiting a planet as the moons in the solar system do, it orbits the system's brown dwarf. "This system is somewhat hard to define using solar-system-based words like 'planet' and 'moon.' The exosatellite is clearly massive enough to be a planet, but it does not orbit a star, though it orbits an object that orbits a star," team leader Kevin Hoy of the Universidad Diego Portales and the Millennium Nucleus of Young Exoplanets and their Moons (YEMS) in Chile, said in a statement. "Being the third wheel in this system makes us want to call it a moon, even if it is nothing like the small, rocky moons we have in our system."
 
The team currently isn't able to definitively claim this object in CD-35 2722 is an exomoon, because that would require really nailing down a new definition of what a moon is. "The satellite we report is a giant gaseous body orbiting a highly massive companion, itself several times the mass of Jupiter. We have a clear delineation between the planets and the sun in the solar system, so defining things like moons is simple," team member Alice Zurlo of the Universidad Diego Portales said. "In the CD-35 2722 system, where we are blurring the lines between stars, planets, and moons, the whole thing becomes more complicated to describe." Zurlo and colleagues can, however, confidently claim this is an exosatellite, meaning it is a first-of-its-kind detection no matter what the future holds for its classification. 

The findings have been published in the journal Nature.<p></p><div class="share_submission">
<a href="https://tsecurity.de/weiterlesen/3663731/3691872/astronomers-may-have-discovered-first-moon-outside-our-solar-system/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
<a href="https://tsecurity.de/weiterlesen/3663731/3691872/astronomers-may-have-discovered-first-moon-outside-our-solar-system/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>



</div><p><a href="https://tsecurity.de/weiterlesen/3663731/3691872/astronomers-may-have-discovered-first-moon-outside-our-solar-system/" target="_blank" rel="noopener noreferrer">Read more of this story</a> at Slashdot.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Should you use AI for a task? Here’s a simple way to decide | Bruce Schneier]]></title>
<description><![CDATA[Sometimes, what matters isn’t your output but what you put into the process. Think of it like work v the gymI teach public policy at the Harvard Kennedy School and the Munk School at the University of Toronto. And it will come at no surprise to you that my students regularly use AI to complete th...]]></description>
<link>https://tsecurity.de/de/3691471/ai-ki-nachrichten/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide-bruce-schneier/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3691471/ai-ki-nachrichten/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide-bruce-schneier/</guid>
<pubDate>Fri, 24 Jul 2026 14:06:15 +0200</pubDate>
<content:encoded><![CDATA[<p>Sometimes, what matters isn’t your output but what you put into the process. Think of it like work v the gym</p><p>I teach public policy at the Harvard Kennedy School and the Munk School at the University of Toronto. And it will come at no surprise to you that my students regularly <a href="https://tsecurity.de/weiterlesen/3663330/3691471/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide-bruce-schneier/" target="_blank" rel="noopener noreferrer">use AI</a> to complete their writing assignments. Doing so is a waste of their tuition money. But if their entire career is going to include AI writing assistants, why shouldn’t they embrace their future?</p><p>The best way I’ve found to explain the dilemma <a href="https://tsecurity.de/weiterlesen/3663330/3691471/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide-bruce-schneier/" target="_blank" rel="noopener noreferrer">comes from</a> the AI researcher Daniel Meissler: it’s the difference between work and the gym.</p> <a href="https://tsecurity.de/weiterlesen/3663330/3691471/should-you-use-ai-for-a-task-heres-a-simple-way-to-decide-bruce-schneier/" target="_blank" rel="noopener noreferrer">Continue reading...</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[Why enterprises should care about Nokia’s AI-RAN platform]]></title>
<description><![CDATA[Earlier this month, Nokia provided an AI-RAN platform update that brings an AI-native and programmable compute which is projected to double spectral efficiency by 2028. This increases speed, but more importantly, it can allow mobile operators to create some actual monetization beyond connectivity...]]></description>
<link>https://tsecurity.de/de/3690985/it-security-nachrichten/why-enterprises-should-care-about-nokias-ai-ran-platform/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3690985/it-security-nachrichten/why-enterprises-should-care-about-nokias-ai-ran-platform/</guid>
<pubDate>Fri, 24 Jul 2026 10:13:45 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>



<p class="wp-block-paragraph">Earlier this month, Nokia provided an AI-RAN platform update that brings an AI-native and programmable compute which is projected to double spectral efficiency by 2028. This increases speed, but more importantly, it can allow mobile operators to create some actual monetization beyond connectivity.</p>



<p class="wp-block-paragraph">With this release, Nokia is introducing what it calls the industry’s first commercial AI-RAN platform, built on its AI‑native anyRAN software and Nvidia’s Aerial AI-RAN stack running on merchant GPU-based accelerated computing. The company is already seeing more than 20% gains in spectral efficiency from AI-driven radio algorithms, with a roadmap to reach 50% by 2027 and more than 100% by 2028, effectively doubling capacity on existing spectrum in dense cells.</p>



<p class="wp-block-paragraph">Legacy RAN infrastructure enables connectivity but not much beyond that. The AI-RAN makes the network intelligent and extends AI into the physical world, enabling telcos to get more from their infrastructure investments, including <a href="https://tsecurity.de/weiterlesen/3662844/3690985/why-enterprises-should-care-about-nokias-ai-ran-platform/" target="_blank" rel="noopener noreferrer">providing a path to 6G</a>. The partnership with Nvidia brings CUDA and AI into mobile environments.</p>



<p class="wp-block-paragraph">For <em>Network World</em> readers, the headline isn’t just that Nokia got to market first with AI‑RAN—it’s that the company is using AI and GPUs to break the historical coupling between radio performance and custom silicon refresh cycles, and to turn the RAN into an application platform.</p>



<h2 class="wp-block-heading">What AI-RAN actually is</h2>



<p class="wp-block-paragraph">At a technical level, Nokia’s AI‑RAN is a software‑defined baseband architecture that runs Layer 1/Layer 2 RAN functions and AI models on accelerated compute, primarily GPUs, instead of being locked into fixed‑function ASICs. <a href="https://tsecurity.de/weiterlesen/3662844/3690985/why-enterprises-should-care-about-nokias-ai-ran-platform/" target="_blank" rel="noopener noreferrer">Udayan Mukherjee</a>, Nokia’s CTO for RAN and core, summarized the vision in the <a href="https://tsecurity.de/weiterlesen/3662844/3690985/why-enterprises-should-care-about-nokias-ai-ran-platform/" target="_blank" rel="noopener noreferrer">analyst briefing</a>: “AI‑RAN is essentially a platform that turns the radio network into a true AI‑native programmable platform… one software detached from the hardware, defining flexible hardware deployment configurations, including part of the AI grid.”</p>



<p class="wp-block-paragraph">Several pillars stand out:</p>



<ul class="wp-block-list">
<li>AI‑native design: Algorithms move from traditional linear models to increasingly nonlinear techniques (e.g., advanced channel estimation, deep receivers/transmitters, RKHS-based methods), which demand tensor-heavy compute best delivered by GPUs.</li>



<li>Software-defined RAN: The same anyRAN software stack runs across different hardware configurations—plug‑in cards, standalone AI‑RAN nodes, and COTS/cloud RAN—so innovation comes via software releases rather than baseband card swaps.</li>



<li>Programmable “D‑apps” layer: Nokia is pushing a new real‑time E3 interface from Layer 1/2 into an application layer for distributed apps (D‑apps) that can tap IQ samples, channel estimation and scheduling data for use cases such as sensing and location services.</li>



<li>Crucially, this isn’t meant to replace all custom silicon overnight. Mukherjee was explicit: “We are not dropping the purpose‑built product… but we want to also get to merchant silicon, because that’s the future as we want to develop bigger models and AI elements and value‑added services on top of it.” The result is a hybrid era where AI‑accelerated platforms coexist with existing basebands but begin to shoulder the most compute‑intensive workloads.</li>
</ul>



<h2 class="wp-block-heading">Why AI-RAN matters for operators</h2>



<p class="wp-block-paragraph">Nokia and its early operator partners are trying to solve three perennial problems: finite spectrum, changing traffic patterns, and the drag of hardware refresh cycles.</p>



<p class="wp-block-paragraph">First, spectrum constraints. <a href="https://tsecurity.de/weiterlesen/3662844/3690985/why-enterprises-should-care-about-nokias-ai-ran-platform/" target="_blank" rel="noopener noreferrer">Aji Ed</a>, Nokia’s head of AI‑RAN and cloud RAN, called spectrum “the first constraint everybody has,” noting that operators have paid “huge amount of money” for bands and now need to “get up to the 2x spectrum” in terms of usable capacity. By running more complex AI models for multi‑user MIMO pairing, channel estimation, carrier aggregation and deep receiver/transmitter functions on GPUs, Nokia believes it can unlock those gains where traditional platforms simply run out of compute headroom.</p>



<p class="wp-block-paragraph">Second, traffic is shifting. Generative AI and distributed inference workloads are driving more uplink-heavy, latency‑sensitive patterns that current RANs weren’t designed for. AI‑RAN’s ability to adapt scheduling, beamforming and resource allocation dynamically via AI models deployed at the baseband is meant to keep up with this shift.</p>



<p class="wp-block-paragraph">Third, innovation cadence. In Ed’s words, “hardware upgrades can’t keep up with the innovation… we can’t really have a silicon refresh cycle linked with every three‑year cycle.” Nokia’s subscription‑based software model is designed to deliver new AI algorithms, spectral‑efficiency improvements and network optimization features continuously, without requiring “forklift” hardware replacements.</p>



<p class="wp-block-paragraph">For operators, the message is attractive: comparable TCO and power to existing basebands, “no hardware premium” for GPU adoption, but higher capacity and a path to new services. Nokia told analysts it has reached performance, price and energy efficiency parity between its custom GridShark silicon and GPU-based systems, while moving the baseband roadmap to merchant silicon.</p>



<h2 class="wp-block-heading">Nokia’s differentiation strategy</h2>



<p class="wp-block-paragraph">Every major RAN vendor is talking about AI‑enhanced radio, but Nokia is drawing a line between incremental gains and what it claims is a platform shift. When asked why its 2x spectral efficiency ambition is so much higher than the ~20% numbers competitors discuss, Ed pointed to the underlying architecture: “We are able to bring much more complex algorithms into this compute infrastructure… all of these require much higher compute, which is exactly what is coming from the accelerated computing.”</p>



<p class="wp-block-paragraph">Several differentiators emerge:</p>



<ul class="wp-block-list">
<li>Aggressive spectral roadmap: Nokia is targeting 1.5x by 2027 and 2x by 2028, across TDD massive MIMO and FDD scenarios, with a feature roadmap built jointly with Nvidia and other partners.</li>



<li>Single code base, three deployment paths: The same anyRAN software stack runs on (1) a GPU‑powered AirScale capacity plug‑in card, (2) a high‑capacity standalone AI‑RAN node, and (3) GPU‑based COTS/cloud RAN servers. This lets operators modernize “at their own pace” and mix brownfield evolution with greenfield AI-native deployments.</li>



<li>Open ecosystem with D‑apps: Nokia is leaning into ORAN compliance (front‑haul, O1/O2) and actively championing the E3 interface and D‑apps concept within ORAN and AI‑RAN alliances, with Bell Labs and at least two external partners already building sensing and location applications on the platform.</li>



<li>Software subscription tied to value: The commercial model builds on existing software subscriptions but ties pricing more explicitly to delivered value, such as spectral efficiency improvements and new AI services, rather than pure license metrics.</li>
</ul>



<p class="wp-block-paragraph">Mukherjee emphasized the openness angle in the briefing: “We see a lot of third‑party applications, whether it’s improving spectral efficiency or location service or sensing, can be developed on this platform… any AI‑powered services from us in Nokia or from ecosystems can be actually developed on top of it.” For operators burned by closed optimization stacks, that’s a notable pivot.</p>



<h2 class="wp-block-heading">How AI-RAN unlocks new revenue</h2>



<p class="wp-block-paragraph">Most operators will sign off on AI‑RAN if the capacity and TCO story holds, but the more strategic question is monetization beyond connectivity. Nokia’s spokespeople spent considerable time on this in the analyst call, pointing to several classes of services that are difficult or impossible to deliver without AI running in the RAN itself.</p>



<p class="wp-block-paragraph">Examples include:</p>



<ul class="wp-block-list">
<li>Integrated sensing: Turning the RAN into a distributed sensor grid that can support applications such as 3D mapping, gesture recognition and environmental monitoring, using the same RF infrastructure. Mukherjee noted, “We have at least two to three partners developing sensing applications on top of it… as well as two other companies developing location services.”</li>



<li>Physical AI and location services: For factories, logistics hubs and smart cities, AI‑RAN can provide high‑precision positioning and real‑time telemetry for robots, drones and autonomous systems by fusing radio data and AI models at the edge.</li>



<li>Distributed AI infrastructure: Operators exploring “AI‑native cities” can use AI‑RAN nodes and COTS GPU servers as a distributed inference fabric for applications that need tight latency to endpoints—think AR/VR offload, real‑time video analytics or interactive generative AI experiences.</li>



<li>Premium connectivity tiers: With fine‑grained, AI‑driven control over uplink/downlink scheduling and QoS, operators can create differentiated SLAs for enterprise slices, mission‑critical IoT and AI workloads, charging for guaranteed performance rather than best‑effort connectivity.</li>
</ul>



<p class="wp-block-paragraph">Ed framed the opportunity as a continuum: Superior connectivity from 2x spectral efficiency creates “space for new AI workloads and other use cases,” while the D‑apps ecosystem and subscription model provide a mechanism to package and sell those capabilities. In practice, that could look like:</p>



<ul class="wp-block-list">
<li>Industrial sensing-as-a-service, where Nokia and partners supply D‑apps for integrated sensing and positioning, and operators monetize them per site or per device.</li>



<li>Network‑exposed APIs for inference, location and RF sensing, integrated into operators’ broader network API portfolios as they pursue “network-as-a-platform” strategies.</li>



<li>Sector‑specific AI‑native services, such as stadium analytics, transportation corridor monitoring, or drone traffic management, built by ISVs on top of Nokia’s exposed E3 data.</li>
</ul>



<p class="wp-block-paragraph">For operators that already use Nokia’s MantaRay and SMO stacks for cross‑network optimization, AI‑RAN essentially becomes the local real‑time execution environment, while R‑apps/X‑apps continue to orchestrate macro-level behaviors. Mukherjee described this layered architecture as “DU and CU on the platform running D‑apps using E3, interfacing to X‑apps and R‑apps through E2SM and connecting to the overall management system/SMO for lifecycle management.”</p>



<h2 class="wp-block-heading">Adoption path and reality check</h2>



<p class="wp-block-paragraph">Nokia is not promising instant transformation. AI‑RAN pilots are slated for late 2026, with commercial availability on card‑based systems in 2027 and AirScale-based systems around 2028, all driven from a single software stack that supports 4G, 5G and is upgradable to 6G. The company already has trials and collaborations underway with T‑Mobile US, SoftBank, Indosat Ooredoo Hutchison, BT, Elisa, Vodafone, Orange, NTT Docomo, Deutsche Telekom and others.</p>



<p class="wp-block-paragraph">There are still open questions around 3GPP vs ORAN standardization of E3, the maturity of the D‑apps ecosystem, and how operators will digest yet another subscription layer tied to radio software. But Nokia’s move puts a stake in the ground: in the AI era, the RAN is not just a throughput engine; it’s a programmable AI computer that can be monetized.</p>



<p class="wp-block-paragraph">For <em>Network World</em> readers evaluating vendor roadmaps, this launch suggests a clear directional change. If Nokia hits its targets, AI‑RAN could mark the point where baseband becomes less about hardware SKUs and more about an AI platform strategy—one where spectral efficiency and new services are rolled out at “software speed,” as Ed described it, rather than at the pace of the next card generation.</p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Cutting Through the AI Hype | Teamwork Reinvention with Accenture and Atlassian | Atlassian]]></title>
<description><![CDATA[Author: Atlassian - Bewertung: 1x - Views:8 What is AI really doing for the enterprise — and what's just hype? At the SAFe Summit 2026 in Amsterdam, Renaud Granier (Accenture), Zach Brown (Atlassian), and Saahil Panikar (Atlas Revolutions) sit down for an unfiltered conversation about the state o...]]></description>
<link>https://tsecurity.de/de/3690871/youtube-security-videos/cutting-through-the-ai-hype-teamwork-reinvention-with-accenture-and-atlassian-atlassian/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3690871/youtube-security-videos/cutting-through-the-ai-hype-teamwork-reinvention-with-accenture-and-atlassian-atlassian/</guid>
<pubDate>Fri, 24 Jul 2026 09:00:36 +0200</pubDate>
<content:encoded><![CDATA[<p>Author: Atlassian - Bewertung: 1x - Views:8 <br/></p><p><iframe id="ytplayer" loading="lazy" type="text/html" width="100%" height="auto" src="https://www.youtube.com/embed/w7X18TEx-S0?autoplay=1&origin=http://tsecurity.de" frameborder="0"></iframe></p><p>What is AI really doing for the enterprise — and what's just hype? At the SAFe Summit 2026 in Amsterdam, Renaud Granier (Accenture), Zach Brown (Atlassian), and Saahil Panikar (Atlas Revolutions) sit down for an unfiltered conversation about the state of AI in business today.<br />
<br />
From the difference between prediction and reasoning, to the growing problem of AI sprawl, to why change management might matter more than the technology itself — this is a must-watch for anyone trying to make sense of AI in their organization.<br />
<br />
About Atlassian:<br />
Behind every great human achievement, there is a team. From medicine and space travel to disaster response and pizza deliveries, we help teams all over the planet advance humanity through the power of software. Our mission is to help unleash the potential of every team.<br />
<br />
Connect with Atlassian:<br />
Subscribe: https://www.youtube.com/@Atlassian<br />
Follow Atlassian on LinkedIn: https://www.linkedin.com/company/atlassian<br />
Follow Atlassian on Instagram: https://instagram.com/atlassian<br />
Follow Atlassian on X: https://twitter.com/atlassian<br />
Follow Atlassian on Facebook: https://facebook.com/atlassian<br/></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[District judge assigned to oversee Apple's trade secrets lawsuit against OpenAI]]></title>
<description><![CDATA[A federal district judge will oversee Apple's lawsuit accusing OpenAI of using stolen intellectual property to advance its hardware efforts.OpenAI CEO Sam Altman - image credit: Emerson CollectiveIn early July, Apple sued OpenAI after alleging that two ex-employees successfully stole intellectual...]]></description>
<link>https://tsecurity.de/de/3690526/apple-ios-macos/district-judge-assigned-to-oversee-apples-trade-secrets-lawsuit-against-openai/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3690526/apple-ios-macos/district-judge-assigned-to-oversee-apples-trade-secrets-lawsuit-against-openai/</guid>
<pubDate>Fri, 24 Jul 2026 03:31:51 +0200</pubDate>
<content:encoded><![CDATA[A federal district judge will oversee Apple's lawsuit accusing OpenAI of using stolen intellectual property to advance its hardware efforts.<br><br><div><img src="https://photos5.appleinsider.com/gallery/68254-143883-000-lead-Sam-Altman-xl.jpg" alt="Man with short brown hair wearing a tan long sleeve shirt and clip-on microphone, seated against a dark background, looking slightly to the side with a neutral thoughtful expression" height="720" class=""><br><span>OpenAI CEO Sam Altman - image credit: Emerson Collective</span></div><br>In early July, <a href="https://tsecurity.de/weiterlesen/3662385/3690526/district-judge-assigned-to-oversee-apples-trade-secrets-lawsuit-against-openai/" target="_blank" rel="noopener noreferrer">Apple sued</a> OpenAI after alleging that two ex-employees successfully stole intellectual property to enrich OpenAI's development efforts. Now, on Thursday, a judge has been assigned to the case.<br><br>Initially, when the suit was first filed, it was randomly assigned to Magistrate Judge Virginia K. DeMarchi. Now, it seems as though U.S. District Judge Edward Davila will oversee the case.<br><br><br> <a href="https://tsecurity.de/weiterlesen/3662385/3690526/district-judge-assigned-to-oversee-apples-trade-secrets-lawsuit-against-openai/" target="_blank" rel="noopener noreferrer">Continue Reading on AppleInsider</a> | <a href="https://tsecurity.de/weiterlesen/3662385/3690526/district-judge-assigned-to-oversee-apples-trade-secrets-lawsuit-against-openai/" target="_blank" rel="noopener noreferrer">Discuss on our Forums</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[Researchers Discover First Known Transmissible Cancer In Fish]]></title>
<description><![CDATA[An anonymous reader quotes a report from CBC News: It's rare that cancerous tumors can spread from one individual to another. But a genetic study suggests that's what's happening with melanoma tumors among catfish in Quebec and the northeastern U.S. The discovery represents the first known transm...]]></description>
<link>https://tsecurity.de/de/3689455/it-security-nachrichten/researchers-discover-first-known-transmissible-cancer-in-fish/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3689455/it-security-nachrichten/researchers-discover-first-known-transmissible-cancer-in-fish/</guid>
<pubDate>Thu, 23 Jul 2026 17:12:45 +0200</pubDate>
<content:encoded><![CDATA[An anonymous reader quotes a report from CBC News: It's rare that cancerous tumors can spread from one individual to another. But a genetic study suggests that's what's happening with melanoma tumors among catfish in Quebec and the northeastern U.S. The discovery represents the first known transmissible cancer in fish and one of very few transmissible cancers ever found, reported the study published in the journal Nature on Wednesday.
 
Julie Dragon, co-leader of the new study, noted that only three other transmissible cancers have ever been identified so far -- in Tasmanian devils, dogs and shellfish. "These conditions are incredibly rare in nature," she said. "So something has to be happening to allow this to happen." Anglers in Lake Memphremagog, which spans the border between Quebec and Vermont, first reported catching brown bullhead catfish with strange black spots and lumps in 2012. They turned out to be melanoma skin cancer tumors. (Humans can also get this kind of cancer.) Now, about a third of the brown bullheads living in the lake have them.
 
It's not clear how sick the fish become. In some cases, the cancer spreads to other organs, such as the brain or liver. But many fish with lesions seem relatively healthy and some older fish even have them, suggesting they can live with the disease for a time. Because of the sudden appearance of the black lesions in Lake Memphremagog the year after a huge flood caused by post-tropical storm Irene, locals worried they were caused by carcinogens washed into the lake by floodwaters. Tests for carcinogens haven't been conclusive, although a study published in May found higher concentrations of seven metals, including zinc and the carcinogen arsenic, in the skin of fish with the tumors. Researchers suspect the tumors may spread among adult fish during spawning, when crowded fish rub against one another and may be punctured by their spines.
 
"They... swim all over each other and we think it's possible that they poke each other and cells can get into other fish that way," Dragon said, though transmission has not yet been demonstrated.<p></p><div class="share_submission">
<a href="https://tsecurity.de/weiterlesen/3661314/3689455/researchers-discover-first-known-transmissible-cancer-in-fish/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
<a href="https://tsecurity.de/weiterlesen/3661314/3689455/researchers-discover-first-known-transmissible-cancer-in-fish/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>



</div><p><a href="https://tsecurity.de/weiterlesen/3661314/3689455/researchers-discover-first-known-transmissible-cancer-in-fish/" target="_blank" rel="noopener noreferrer">Read more of this story</a> at Slashdot.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[SAP S/4HANA-Transformation zwischen Aufbruch und Realität]]></title>
<description><![CDATA[Ob hybrides Betriebsmodell oder Kostenfrage, am Ende entscheidet über den Projekterfolg nicht allein die Technologie.hasan as’ari – shutterstock.com



SAP-Anwenderunternehmen stehen unter Druck, auf SAP S/4HANA zu wechseln, weil die Mainstream-Wartung für SAP ERP (SAP ECC 6.0) Ende 2027 ausläuft...]]></description>
<link>https://tsecurity.de/de/3687936/it-security-nachrichten/sap-s4hana-transformation-zwischen-aufbruch-und-realitaet/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3687936/it-security-nachrichten/sap-s4hana-transformation-zwischen-aufbruch-und-realitaet/</guid>
<pubDate>Thu, 23 Jul 2026 06:09:16 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure class="wp-block-image size-large"><img loading="lazy" src="https://b2b-contenthub.com/wp-content/uploads/2026/07/shutterstock_2443989867_16x9.png?w=1024" alt="ERP SAP Studie 27" class="wp-image-4199877" width="1024" height="576" sizes="auto, (max-width: 1024px) 100vw, 1024px"><figcaption class="wp-element-caption"><p>Ob hybrides Betriebsmodell oder Kostenfrage, am Ende entscheidet über den Projekterfolg nicht allein die Technologie</p>.</figcaption></figure><p class="imageCredit">hasan as’ari – shutterstock.com</p></div>



<p class="wp-block-paragraph">SAP-Anwenderunternehmen stehen unter Druck, auf SAP S/4HANA zu wechseln, weil die Mainstream-Wartung für SAP ERP (SAP ECC 6.0) Ende 2027 ausläuft und die bis Ende 2030 geltende erweiterte Wartung kostenpflichtig ist.</p>



<p class="wp-block-paragraph">Zwar stellt SAP mit der „<a href="https://tsecurity.de/weiterlesen/3659795/3687936/sap-s4hana-transformation-zwischen-aufbruch-und-realitaet/" target="_blank" rel="noopener noreferrer">SAP ERP, Private Edition, Transition Option</a>“ eine weitere Wartungsverlängerung bis 2033 in Aussicht. Da diese einer Neuimplementierung gleichkommt, bleibt SAP-Kunden mehr Zeit für die Planung, die Analyse und das Changemanagement. Der Nachteil: Wer diese Option nutzt, läuft Gefahr, technologisch ins Hintertreffen zu geraten, da Innovationen nahezu ausschließlich für SAP S/4HANA bereitgestellt werden.</p>



<h2 class="wp-block-heading">Zögerliche SAP-S/4HANA-Transformation trotz Wartungsdruck</h2>



<p class="wp-block-paragraph">Obwohl der Druck hoch ist, hat eine große Zahl der SAP-Bestandskunden die Transformation auf die seit 2015 verfügbare ERP-Suite offenbar noch nicht vollzogen. Eine COMPUTERWOCHE-Expertenrunde zeigte, wo die größten Hürden liegen und was erfolgreiche Projekte auszeichnet.</p>



<p class="wp-block-paragraph">Warum etliche Unternehmen die Transformation vor dem regulären Wartungsende scheuen und stattdessen zwei Prozent Mehrkosten für die erweiterte Wartung einkalkulieren, brachte ein Teilnehmender auf den Punkt: Firmen haben über Jahrzehnte in ihre SAP-ERP-Lösung investiert und sie an individuelle Prozessanforderungen angepasst, damit die Abläufe entlang der Supply Chain reibungslos laufen. Er habe daher in den vergangenen zehn Jahren keinen Kunden erlebt, der freiwillig umsteigen wollte. Alle hätten gesagt, dass sie müssen.</p>



<p class="wp-block-paragraph">Nach Erfahrungswerten eines weiteren Experten nutzen erst rund 20 Prozent der SAP-Kunden SAP S/4HANA als Kernapplikation produktiv, unter anderem, weil entsprechende Transformationsprojekte auf sieben bis neun Jahre angelegt sind.</p>



<h2 class="wp-block-heading">Altlasten bremsen die SAP-S/4HANA-Transformation</h2>



<p class="wp-block-paragraph">Unternehmen, die sich für den Wechsel entscheiden, verzichten häufig auf jede Modernisierung. Sie vollziehen einen Eins-zu-eins-Umstieg ohne Code-Modifikation, sei es in Form einer System Conversion (Brownfield-Ansatz) oder per Lift and Shift in SAP Cloud ERP Private (früher: SAP S/4HANA Cloud Private Edition). Dabei ist eine große Zahl von SAP-ERP-Installationen gar nicht zukunftsfähig, weil sie auf Prozessen aus den 1990er Jahren basieren und im Lauf der Jahre durch zahlreiche Eigenentwicklungen erweitert wurden.</p>



<p class="wp-block-paragraph">Nicht selten gibt es bis zu mehrere tausend kundeneigene Programme im Z/Y-Namensraum, die zum Teil nicht mehr genutzt werden und das System unnötig belasten. Die Experten waren sich einig, dass eine solche rein technische Migration, bei der Altlasten wie ABAP-Eigenentwicklungen mitgeschleppt werden, keinen Mehrwert für das Unternehmen bringt.</p>



<p class="wp-block-paragraph">Es muss geprüft werden, welche Eigenentwicklungen beibehalten werden, weil sie wettbewerbsdifferenzierend und damit geschäftskritisch sind, und welche gelöscht werden müssen, weil sie nicht genutzt werden oder weil es dafür inzwischen SAP-Standardfunktionen gibt. Handlungsbedarf besteht auch bei einer dreistelligen Anzahl von Buchungskreisen, von denen niemand weiß, welche noch benötigt werden, oder bei zahlreichen Dubletten in den Kreditoren- und Debitorenstammdaten.</p>



<figure class="wp-block-table"><div class="overflow-table-wrapper"><table class="has-fixed-layout"><tbody><tr><td><strong>Studie “SAP S4HANA”: Sie können sich noch beteiligen!</strong></td></tr><tr><td>Zum Thema SAP S4HANA führt die COMPUTERWOCHE derzeit eine Multi-Client-Studie unter IT-Verantwortlichen durch. Haben Sie Fragen zu dieser Studie oder wollen Partner bei dieser Studie werden, helfen wir Ihnen unter <a href="mailto:research-sales@foundryco.com" target="_blank" rel="noreferrer noopener">research-sales@foundryco.com</a> gerne weiter. </td></tr></tbody></table> </div></figure>



<h2 class="wp-block-heading">Migrations-Tools und KI-Agenten beschleunigen den Umstieg</h2>



<p class="wp-block-paragraph">Um diesen Prüf- und Bereinigungsaufwand zu bewältigen, bietet SAP mehrere Tools, um die Transformation auf SAP S/4HANA zu vereinfachen: darunter SAP Activate, SAP Cloud ALM, Migration Cockpit, Readiness Check, Custom-Code-Check oder Modifikationsabgleich. Ergänzt werden sie durch Lösungen wie Signavio für die Prozessanalyse. Die Experten schätzen den Effizienzgewinn durch solche Migrationswerkzeuge auf 30 bis 50 Prozent.</p>



<p class="wp-block-paragraph">Zusätzliche Produktivität versprechen KI-Agenten, die Altsysteme automatisiert analysieren, Code bereinigen und Datenflüsse transformieren. Das reduziert den Migrationsaufwand und beschleunigt den Umstieg.</p>



<h2 class="wp-block-heading">Scope-Management als Schlüssel für den Projekterfolg</h2>



<p class="wp-block-paragraph">Einig waren sich die Teilnehmenden, dass SAP-S/4HANA-Transformationsprojekte in der Regel nicht an der Technologie scheitern, sondern an einer mangelhaften Scope-Definition und am unzureichenden Changemanagement.</p>



<p class="wp-block-paragraph">Ein Scope-Management vor dem Projektstart, das berücksichtigt, wie viel Veränderung der IT-Organisation und den Fachbereichen zugemutet werden kann, sei essenziell für den Erfolg, sagte einer der Teilnehmenden. Es erfordert die Fähigkeit zu priorisieren und ein iteratives Vorgehen, bei dem zunächst geschäftskritische Must-haves und Quick Wins umgesetzt werden. Weniger wichtige Nice-to-haves folgen später. Wer dagegen in der Konzeptionsphase bereits den großen Wurf anstrebt, wird voraussichtlich scheitern. Als Beispiel wurde der direkte Umstieg auf ein SAP-S/4HANA-Kernsystem genannt, das nach dem Clean-Core-Ansatz von nicht mehr lauffähigen Programmen und obsoleten Erweiterungen bereinigt ist.</p>



<p class="wp-block-paragraph">Genauso wichtig ist ein Change-Management, das Mitarbeitende von Beginn an einbezieht, die nötige Akzeptanz schafft und vom Top-Management aktiv unterstützt wird, sowie eine verbindliche Governance mit klaren Zielvorgaben. Unverzichtbar ist auch die Einbindung der Fachbereiche. Sie stellt die größte Herausforderung dar, da Unternehmen befürchten, dass durch die SAP-S/4HANA-Transformation zu viele personelle Ressourcen gebunden werden, die dann für Kernaufgaben fehlen. Kommt es vor, dass IT und Fachbereiche als Antipoden agieren, sollte ein Change-Coach als Vermittler eingesetzt werden.</p>



<h2 class="wp-block-heading">Hybride Betriebsmodelle setzen sich langfristig durch</h2>



<p class="wp-block-paragraph">Bereits vor dem Projektstart muss abschließend geklärt sein, welches Betriebsmodell für SAP S/4HANA am besten zu einem Unternehmen und seinen Zielen passt, auch mit Blick auf regulatorische Anforderungen. Das ist häufig nicht der Fall, sodass das Projektteam unnötig Zeit damit verbringt, das passende Betriebsmodell zu ermitteln. Das bremst Transformationsvorhaben aus.</p>



<p class="wp-block-paragraph">Nach Ansicht eines Teilnehmenden wird sich langfristig ein hybrides Betriebsmodell durchsetzen, bei dem der SAP-Kunde entscheidet, welche Elemente der SAP-S/4HANA-Landschaft in einer Hyperscaler-Cloud, einer souveränen Cloud und/oder On-Premises laufen. Eine weitere, weitgehend unbekannte Möglichkeit ist der Betrieb im Rahmen der Customer-Data-Center-Option (CDC) von SAP Cloud ERP Private (früher: SAP S/4HANA Cloud Private Edition), die aus Gründen wie Datenschutz, Leistung und Souveränität eine interessante Alternative sein kann.</p>



<p class="wp-block-paragraph">Mehrere Experten stellen darüber hinaus fest, dass die vollwertige SaaS-Lösung SAP Cloud ERP Public (früher: SAP S/4HANA Cloud Public Edition) inzwischen verstärkt eingesetzt wird. Sie stellt vorkonfigurierte Kern-ERP-Funktionen (Best Practices) bereit und lässt sich relativ schnell einführen, ermöglicht aber kaum individuelle Anpassungen. Diese Abstriche nehmen Unternehmen in Kauf, um von regelmäßigen, automatischen Upgrades und technologischen Innovationen zu profitieren.</p>



<p class="wp-block-paragraph">Kritisiert wurde allerdings, dass die Cloud-Diskussion häufig unter begrifflichen Unschärfen leidet. So macht der Betrieb von SAP S/4HANA in einer Hyperscaler- oder SAP-Cloud die Lösung noch lange nicht zum Software-as-a-Service-Angebot. Solche Ungenauigkeiten irritierten SAP-Kunden und bremsten die Entscheidungsfindung. Letztlich sind beim Cloud-Betrieb auch die Kosten entscheidend. Zwar wollen viele Unternehmen anfangs maximale Sicherheit mit Private Network und Confidential Computing, wählen dann aber günstigere Commercial-Cloud-Angebote. Ausnahmen bilden regulierte Branchen und der öffentliche Sektor.</p>



<p class="wp-block-paragraph">Ob hybrides Betriebsmodell oder Kostenfrage, am Ende entscheidet über den Projekterfolg nicht allein die Technologie, sondern auch, wie diszipliniert Scope und Wandel im Unternehmen gesteuert werden.</p>



<h2 class="wp-block-heading">Teilnehmer der Round-Table “SAP S4HANA 2027”</h2>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure class="wp-block-image size-large"><img loading="lazy" src="https://b2b-contenthub.com/wp-content/uploads/2026/07/Albrecht-Munz-HPE_169.jpg?quality=50&amp;strip=all&amp;w=1024" alt="Albrecht Munz, HPE" class="wp-image-4199942" width="1024" height="576" sizes="auto, (max-width: 1024px) 100vw, 1024px"><figcaption class="wp-element-caption"><p>Albrecht Munz, HPE: </p> <p>„Die SAP-S/4HANA-Migration ist primär ein erster technischer Pflichtlauf, der die IT seitige Grundlage für die digitale Transformation schaffen kann. Dass viele Unternehmen hier stagnieren, liegt auch am in diesem Zusammenhang häufig anzutreffenden Cloud-Washing: Das Hosting eines ERP-Systems in der Cloud liefert noch lange nicht die Innovations- und Business-Effekte einer wirklich Cloud-nativen SaaS-Architektur.“</p></figcaption></figure><p class="imageCredit">Harald Becker / Hewlett-Packard GmbH</p></div>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure class="wp-block-image size-large"><img loading="lazy" src="https://b2b-contenthub.com/wp-content/uploads/2025/01/Anke-Frier_LHIND_TESTIMONIALS_030_16x9.png?w=1024" alt="Anke Frier, Lufthansa Industry Solutions " class="wp-image-3634299" width="1024" height="576" sizes="auto, (max-width: 1024px) 100vw, 1024px"><figcaption class="wp-element-caption"><p>Anke Frier, Lufthansa Industry Solutions:</p>
<p>„Unternehmen, die sich für eine technische SAP-S/4HANA-Transformation entschieden haben, dürfen diese nicht mit dem Go-Live als abgeschlossen betrachten. Der langfristige Erfolg hängt davon ab, wie konsequent danach die neuen technologischen Möglichkeiten genutzt werden, um Prozesse umzugestalten, zu digitalisieren und durch KI-Einsatz zu unterstützen. Erst dadurch entsteht ein messbarer Business Value.“</p></figcaption></figure><p class="imageCredit">Sonja Brüggemann / Lufthansa Industry Solutions GmbH &amp; Co. KG</p></div>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure class="wp-block-image size-large"><img loading="lazy" src="https://b2b-contenthub.com/wp-content/uploads/2026/07/Peter_Buermann_Microsoft_16x9.png?w=1024" alt="Peter Büermann, Microsoft" class="wp-image-4199948" width="1024" height="576" sizes="auto, (max-width: 1024px) 100vw, 1024px"><figcaption class="wp-element-caption"><p>Peter Büermann, Microsoft:</p>
<p>„Der optimale Zeitpunkt für den Umstieg auf SAP S/4HANA ist jetzt. Die Reife der Migrationswerkzeuge, standardisierte Vorgehensmodelle und die umfangreiche Projekterfahrung der SAP-Partnerlandschaft reduzieren das Risiko deutlich. Damit sind die wesentlichen Hürden vergangener Jahre weitgehend beseitigt und Unternehmen profitieren von einer schnelleren Implementierung, geringeren Kosten und einer höherer Projektqualität.“</p>
</figcaption></figure><p class="imageCredit">Microsoft Deutschland GmbH</p></div>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure class="wp-block-image size-large"><img loading="lazy" src="https://b2b-contenthub.com/wp-content/uploads/2026/07/Roland_Storbeck_Natuvion_090726_285_16x9.png?w=1024" alt="Roland Storbeck, Natuvion" class="wp-image-4199949" width="1024" height="576" sizes="auto, (max-width: 1024px) 100vw, 1024px"><figcaption class="wp-element-caption"><p>Roland Storbeck, Natuvion:</p>
<p>„Wirklich erfolgreich sind die SAP-S/4HANA-Migrationen, deren Scope noch vor dem Projektstart klar definiert und gemanagt wird. Wer zu Beginn zu hohe Ansprüche hat und jeden Prozess umdrehen will, dessen Vorhaben scheitert häufig schon in der Konzeptionsphase. Zudem muss jedes Unternehmen die Frage beantworten, wie viel Change seine IT- und Business-Organisation überhaupt verträgt. Neben einem klaren Scope ist dringend zu empfehlen, den eigenen Datenbestand vor Projektstart zu analysieren und aufzuräumen.“</p>
</figcaption></figure><p class="imageCredit">VOGUS – Wolfgang Voglhuber / Natuvion GmbH</p></div>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure class="wp-block-image size-large"><img loading="lazy" src="https://b2b-contenthub.com/wp-content/uploads/2026/07/Matthias-Draschner_smartshift.jpg?quality=50&amp;strip=all&amp;w=1024" alt="Matthias Draschner, smartShift" class="wp-image-4199950" width="1024" height="576" sizes="auto, (max-width: 1024px) 100vw, 1024px"><figcaption class="wp-element-caption"><p>Matthias Draschner, smartShift:</p>
<p>„Für viele Unternehmen ist SAP in erster Linie eine über Jahre oder sogar Jahrzehnte gewachsene IT-Landschaft, die geschäftskritische Prozesse unterstützt und absichert. Entsprechend besteht die berechtigte Erwartung, dass diese Prozesse auch nach der Migration auf SAP S/4HANA zuverlässig und möglichst unverändert weiterlaufen. Gleichzeitig bietet die SAP-S/4HANA-Transformation die Chance, Custom Code entweder zu modernisieren und auf die Anforderungen einer Cloud-fähigen Architektur auszurichten oder zu entfernen, sofern er nicht mehr benötigt wird. Spezielle Analyse- und Automatisierungstools unterstützen diesen Prozess.“</p>
</figcaption></figure><p class="imageCredit">smartShift Technologies GmbH</p></div>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[citesure 0.2: CourtListener case law and CJK title matching]]></title>
<description><![CDATA[LLM-written bibliographies do not stop at arXiv preprints. Law review drafts invent reporter cites; multilingual papers mangle Chinese titles. citesure 0.2 extends the integrity gate into those failure modes.


  
  
  US case law via CourtListener


References that look like court cases — @juris...]]></description>
<link>https://tsecurity.de/de/3687660/sichere-programmierung/citesure-02-courtlistener-case-law-and-cjk-title-matching/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3687660/sichere-programmierung/citesure-02-courtlistener-case-law-and-cjk-title-matching/</guid>
<pubDate>Wed, 22 Jul 2026 23:50:58 +0200</pubDate>
<content:encoded><![CDATA[<p>LLM-written bibliographies do not stop at arXiv preprints. Law review drafts invent reporter cites; multilingual papers mangle Chinese titles. <strong>citesure 0.2</strong> extends the integrity gate into those failure modes.</p>

<h2>
  
  
  US case law via CourtListener
</h2>

<p>References that look like court cases — <code>@jurisdiction</code> entries, <code>Plaintiff v. Defendant</code> titles, or reporter strings such as <code>347 U.S. 483</code> — are resolved against Free Law Project CourtListener. Ranking prefers an exact reporter cite over companion orders, so Brown lands on <code>347 U.S. 483</code> rather than a later procedural listing.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight bibtex"><code><span class="nc">@jurisdiction</span><span class="p">{</span><span class="nl">brown1954</span><span class="p">,</span>
  <span class="na">title</span>        <span class="p">=</span> <span class="s">{Brown v. Board of Education}</span><span class="p">,</span>
  <span class="na">year</span>         <span class="p">=</span> <span class="s">{1954}</span><span class="p">,</span>
  <span class="na">howpublished</span> <span class="p">=</span> <span class="s">{347 U.S. 483}</span><span class="p">,</span>
<span class="p">}</span>
</code></pre>

</div>





<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>citesure check examples/packs/us-case-law.bib
citesure warm-cache cases.bib
</code></pre>

</div>



<p>Optional <code>COURTLISTENER_TOKEN</code> for higher rate limits. Law-review CI: <code>templates/journal/law-review.yml</code>.</p>

<h2>
  
  
  CJK-aware matching
</h2>

<p>NFKC + fullwidth folding; character-level similarity for CJK-heavy titles; CJK bigrams in claim scoring so Chinese claims are not silently empty.</p>

<h2>
  
  
  Evidence
</h2>

<ul>
<li>Integrity bench <strong>242/242</strong> (US cases + Chinese titles + multi-domain set)</li>
<li>Claims mini-bench <strong>29/29</strong>
</li>
<li>Eight domain packs including <code>us-case-law</code>
</li>
</ul>

<h2>
  
  
  Install
</h2>



<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>pip <span class="nb">install</span> <span class="s2">"git+https://github.com/SybilGambleyyu/citesure.git[pdf]"</span>
</code></pre>

</div>



<p>Source: <a href="https://tsecurity.de/weiterlesen/3659519/3687660/citesure-02-courtlistener-case-law-and-cjk-title-matching/" target="_blank" rel="noopener noreferrer">github.com/SybilGambleyyu/citesure</a> · Demo: <a href="https://tsecurity.de/weiterlesen/3659519/3687660/citesure-02-courtlistener-case-law-and-cjk-title-matching/" target="_blank" rel="noopener noreferrer">workers.dev</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Astronomers spot exomoon candidate that's almost as massive as Jupiter]]></title>
<description><![CDATA[Object orbits a brown dwarf, which circles another star, confusing the cosmic taxonomy]]></description>
<link>https://tsecurity.de/de/3687170/it-nachrichten/astronomers-spot-exomoon-candidate-thats-almost-as-massive-as-jupiter/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3687170/it-nachrichten/astronomers-spot-exomoon-candidate-thats-almost-as-massive-as-jupiter/</guid>
<pubDate>Wed, 22 Jul 2026 19:33:35 +0200</pubDate>
<content:encoded><![CDATA[Object orbits a brown dwarf, which circles another star, confusing the cosmic taxonomy]]></content:encoded>
</item>
<item>
<title><![CDATA[Long Presumed Dead, a Thriving Coral Reef Is Discovered in West Africa]]></title>
<description><![CDATA[Scientists have rediscovered a healthy coral reef off the coast of Benin more than 60 years after surveyors first hinted at its existence. "At least eight coral types and eight fish species have formed a thriving ecosystem on this long-forgotten site," reports Inside Climate News. "What they had ...]]></description>
<link>https://tsecurity.de/de/3686097/it-security-nachrichten/long-presumed-dead-a-thriving-coral-reef-is-discovered-in-west-africa/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3686097/it-security-nachrichten/long-presumed-dead-a-thriving-coral-reef-is-discovered-in-west-africa/</guid>
<pubDate>Wed, 22 Jul 2026 13:14:48 +0200</pubDate>
<content:encoded><![CDATA[Scientists have rediscovered a healthy coral reef off the coast of Benin more than 60 years after surveyors first hinted at its existence. "At least eight coral types and eight fish species have formed a thriving ecosystem on this long-forgotten site," reports Inside Climate News. "What they had captured was a wealth of marine life: six types of soft coral; two black corals; and eight species of sheltering fish, from golden African snappers to the Monrovia doctorfish." From the report: While no coral samples have yet been extracted, researchers have classified the site as a mesophotic coral ecosystem (MCE). Such systems are light-dependent communities existing at the lower limits of reef-building corals. At more than 175 feet below the surface, the coral garden they discovered appears patchily scattered on a rocky substrate. Bridging the gap between shallow reefs and deeper benthic habitats, MCEs are home to distinct species and unique environmental conditions. While scientists are increasingly recognizing their ecological and climatic importance, they remain among the least explored elements of tropical and subtropical marine biodiversity. And this one has real potential to unlock new information about coral history.
 
"Since it's an undisturbed marine ecosystem, it can help through carbon dating or paleoclimatic study to tell us which kind of climate system has occurred here in the past," said [Gerard Zinzindohoue, the project lead for Coral Reefs Rediscovering &amp; Exploration in Benin]. "It's better to know the past to help explain the present, and help know which kind of direction we can take in the future." In addition to the blackbar soldierfish, West African goatfish, and Guinean angelfish filmed darting through the reef, the discovery presents potential conservation claims for other marine life. "We will be advocating for its full protection, perhaps by setting up a marine protected area around it," said [Houangninan Midinoudewa, an oceanographic researcher at the Benin Marine Conservation Club], who specializes in elasmobranchs -- the study of sharks, rays, and skates.
 
Midinoudewa is currently submitting an application to designate the area as an Important Shark and Ray Area with the International Union for Conservation of Nature. Based on the knowledge of local fishermen, Midinoudewa is confident the reef is home to sawback angel sharks, silky sharks, brown skates, and marbled stingrays. The team behind the discovery hopes this will spark a wave of similar discoveries in the waters off West Africa, an area of the world underserved by scientific research projects. "I hope the Gulf of Guinea will be a hub for research because we know our resources are being exploited and people [need to] know exactly what we have and why we should care," said Midinoudewa. Zinzindohoue agrees: "We don't need to wait for others to come to our country to show us what is under our sea. We are the ones who must take responsibility."<p></p><div class="share_submission">
<a href="https://tsecurity.de/weiterlesen/3657956/3686097/long-presumed-dead-a-thriving-coral-reef-is-discovered-in-west-africa/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
<a href="https://tsecurity.de/weiterlesen/3657956/3686097/long-presumed-dead-a-thriving-coral-reef-is-discovered-in-west-africa/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>



</div><p><a href="https://tsecurity.de/weiterlesen/3657956/3686097/long-presumed-dead-a-thriving-coral-reef-is-discovered-in-west-africa/" target="_blank" rel="noopener noreferrer">Read more of this story</a> at Slashdot.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Leadership bottlenecks slow AI adoption]]></title>
<description><![CDATA[At Cisco, VP of engineering Jason Andrews deals with all the same technical issues as every other company deploying AI, including ensuring it’s governed, secure, and integrating multiple data sources, legacy systems, and AI models.



But these issues are relatively straightforward compared to th...]]></description>
<link>https://tsecurity.de/de/3685910/it-security-nachrichten/leadership-bottlenecks-slow-ai-adoption/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3685910/it-security-nachrichten/leadership-bottlenecks-slow-ai-adoption/</guid>
<pubDate>Wed, 22 Jul 2026 12:14:12 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>



<p class="wp-block-paragraph">At Cisco, VP of engineering Jason Andrews deals with all the same technical issues as every other company deploying AI, including ensuring it’s governed, secure, and integrating multiple data sources, legacy systems, and AI models.</p>



<p class="wp-block-paragraph">But these issues are relatively straightforward compared to the bigger challenges relating to the fast pace of change, specifically how AI can touch and transform nearly every aspect of business.</p>



<p class="wp-block-paragraph">“We’re thinking about it every day,” he says. “My belief is we’ll be seeing a massive acceleration of everything.”</p>



<p class="wp-block-paragraph">In coding, for example, he’s witnessing productivity increases up to 110% with AI assistants. “I can build apps or custom integrations a lot faster,” he adds.</p>



<p class="wp-block-paragraph">And the real benefit of AI isn’t just in speeding up individual steps in a process, but in making AI the core of a new business process. But building it from scratch puts even more pressure on organizations trying to get employees up to speed on new ways of doing things.</p>



<p class="wp-block-paragraph">“We want to move fast, train people, and get them onboarded,” he says. “But what I thought AI was going to do for my organization nine months ago is different from three months ago.” So by the time something is rolled out, it’s changed three times.</p>



<p class="wp-block-paragraph">“I struggle with the change management aspect,” he says. “The legacy model of change management isn’t fast enough. How do you create that constant learning?”</p>



<p class="wp-block-paragraph">One of the ways Cisco approaches it is to create communities where people can talk about these issues and share best practices and governance, and you have to keep people’s minds open that every day is going to be different than the last, Andrews adds.</p>



<h2 class="wp-block-heading">Testing the AI waters</h2>



<p class="wp-block-paragraph">Cisco isn’t the only organization struggling with change management in the face of the AI tsunami. <a href="https://tsecurity.de/weiterlesen/3657769/3685910/leadership-bottlenecks-slow-ai-adoption/" target="_blank" rel="noopener noreferrer">In a survey of 2,000 global CEOs IBM released in May</a>, 83% of them said AI success depends more on adoption than on the technology itself, and 77% said talent and technology roles are converging.</p>



<p class="wp-block-paragraph">“Thanks to Claude Code, our entire development cadence is exponentially greater than a year ago,” says Andrew Johnson, CIO at Brownstein Hyatt Farber Schreck, a Denver-based law firm with about 700 employees and clients around the US. But, as with Cisco, the biggest challenge isn’t technical.</p>



<p class="wp-block-paragraph">“In our industry, with our circumstances, we’re probably less constrained by technical capability than organizational constraints, culture, aptitude, the need to bind people to technology, and what helps me and the client,” he says. “There’s a tremendous amount of cultural shift that has to happen in our organization, which is far more demanding of my attention and complexity of thought than the technical stuff.”</p>



<p class="wp-block-paragraph">Companies that bill by the hour, such as law firms, may face additional challenges as attorney productivity increases because billable hours might go down. Alternatively, the total number of cases could go up as litigation becomes less expensive. Either way, firms that adapt will see competitive advantage, and the rest will fall behind, putting more pressure on the need for change management.</p>



<p class="wp-block-paragraph">“If people can’t embrace technology, we won’t be able to get a lot of value out of it,” says Johnson. “I’m talking to people about adapting their way of work. There are certainly a lot of people intrigued and anxious to dive in. They recognize the connection between the potential of the technology and what we do.”</p>



<p class="wp-block-paragraph">But helping everyone see that connection and then working with them to change their habits is difficult, and requires solid relationships and good communications. “That’s been far more of a bottleneck for us,” he says.</p>



<p class="wp-block-paragraph">To address the issue, the firm has developed a network of technology champions who also understand the legal side of the business. “Now we need lawyers who know how to use the technology and can articulate these things to the people we’re trying to reach,” Johnson says.</p>



<p class="wp-block-paragraph">But change management is only one leadership bottleneck slowing AI adoption. Companies also struggle with figuring out their vision for AI, with slow decision-making, and a tendency to focus on the past instead of the future.</p>



<h2 class="wp-block-heading">Vision and strategy</h2>



<p class="wp-block-paragraph"><a href="https://tsecurity.de/weiterlesen/3657769/3685910/leadership-bottlenecks-slow-ai-adoption/" target="_blank" rel="noopener noreferrer">In another survey, this time of 950 business leaders released by Grant Thornton</a> in April, 51% said strategy is the biggest driver of ROI when it comes to AI adoption, but 79% of operations leaders said they don’t have a fully developed and implemented AI strategy.</p>



<p class="wp-block-paragraph">“Having leadership understanding why AI is needed and what objective they’re trying to achieve is very important,” says Shivi Verma, senior manager of engineering at Docusign. “Sometimes leadership doesn’t have a strategy for their organization on how AI should be adopted. Many times it’s bottom-up, which creates a chaotic experience.”</p>



<p class="wp-block-paragraph">When Docusign started adopting gen AI, different teams and organizational units wanted to go in different directions. “All were coming up with their own strategy and tooling,” he says. So Docusign brought business leaders together to understand the pain points, and decide on the technology.</p>



<p class="wp-block-paragraph">“Getting requirements and placing a bet on a specific technology was important,” he says, “as well as pivoting to a different technology if needed.”</p>



<p class="wp-block-paragraph">In order to adapt to changes, the company wanted to have a nimble approach, starting with smaller use cases, with power users, and problem areas.</p>



<p class="wp-block-paragraph">“We try to plan for four to six months,” he adds. “We set expectations for our leadership that we place a bet with a specific technology, but want to be able to pivot.”</p>



<p class="wp-block-paragraph">Today, the leadership challenge front lines have moved yet again, to agentic AI. “Folks are creating their own agents and deciding their own permissions,” Verma adds. “We’re still coming up with a governance strategy.”</p>



<h2 class="wp-block-heading">Slow decision-making</h2>



<p class="wp-block-paragraph">When it comes to AI deployments, Dan Diasio, global AI consulting leader at EY and CTO for its US consulting business, admits he’s a bottleneck.</p>



<p class="wp-block-paragraph">There’s a great deal of interest in what AI can do, and using a variety of new AI tools. But since the firm deals with sensitive client data, safety is paramount. It’s a slow process, but important to build secure infrastructure, and to have trust in the technology. “That’s a reasonable bottleneck that makes sense,” he says.</p>



<p class="wp-block-paragraph">Trust in the tools they work with is essential because clients expect it. “Every tool we use has to go through a detailed security and information privacy impact assessment, as well as a whole other set of controls so they can be used appropriately and safely,” he says.</p>



<p class="wp-block-paragraph">These reviews can take a lot of time, though, and in the age of AI, speed is a highly valued currency. So how do you balance the two, when safety reviews can require input from a lot of different stakeholders and be extremely time intensive?</p>



<p class="wp-block-paragraph">“We’ve stood up a team to be able to quickly certify and address a variety of platforms,” Diasio says. “Instead of working with different departments in the way we used to, we’ve started identifying representatives from different departments into a cohort. Decisions we used to make in months now take weeks.”</p>



<p class="wp-block-paragraph">According to a <a href="https://tsecurity.de/weiterlesen/3657769/3685910/leadership-bottlenecks-slow-ai-adoption/" target="_blank" rel="noopener noreferrer">West Monroe survey</a> of more than 1,200 leaders released earlier this year, slow decision-making is already showing up on the bottom line. Nearly three out of four leaders said their organizations lose up to 5% of annual revenue to slow decision-making and delayed execution.</p>



<p class="wp-block-paragraph">And the top reasons for the delays? According to 40% of the managers surveyed, the problem was the skills gaps of overwhelmed teams, and 35% pointed to layers of management or approvals. Nearly half said they’re spending 10 to 25% of their time on rework, excessive approvals, and unnecessary meetings, and more than half say up to 50% of their projects fail or lose momentum to delays.</p>



<h2 class="wp-block-heading">Focus on the future, not the past</h2>



<p class="wp-block-paragraph">When it comes to the decision about where to apply AI in an organization, the tendency, Diasio says, is to turn to the experts with the most expertise in the business. But these are the same people most likely to focus on improving on what they’re already doing.</p>



<p class="wp-block-paragraph">“And that often blinds people to what’s possible in the future,” he says. “That becomes a significant bottleneck.” So the solution is to revamp the decision-making process around the new reality.</p>



<p class="wp-block-paragraph">“What we see some advanced companies do is give people who don’t understand the process but understand the technology equal footing with people who don’t understand the technology but understand the process,” he says. “A lot of companies are disproportionately focused on just addressing their operating model right now.”</p>



<p class="wp-block-paragraph">Instead of focusing on what they’re currently doing, AI-native companies will start with a focus on the customer, he says. This shift in focus isn’t likely to show up immediately on the bottom line, or result in the highest possible number of pilots going into production.</p>



<p class="wp-block-paragraph">“If leaders are in a position where they’re justifying the use of a technology to the board or their CFO, they become a bottleneck when they start demonstrating their value in terms of the number of things they’re doing,” Diasio says.</p>



<p class="wp-block-paragraph">But 150 or 200 use cases deployed into production may feel like progress, like things are happening in the organization. But all these use cases are a waste of time and money if they’re applied to existing processes that don’t move the needle. “We see that happen in organizations today,” he says. “Maybe we need to reinvent the processes.”</p>



<p class="wp-block-paragraph">It’s no secret that companies will need to change in order to adapt to AI. <a href="https://tsecurity.de/weiterlesen/3657769/3685910/leadership-bottlenecks-slow-ai-adoption/" target="_blank" rel="noopener noreferrer">Deloitte recently surveyed</a> 660 global technology leaders and 81% said their current operating model can deploy and govern AI enterprise-wide, but 75% also said their organization must change its operating model within the next 12 to 18 months to drive greater value.</p>



<p class="wp-block-paragraph">AI ROI is real, says China Widener, Deloitte vice chair and US tech, media, and telecom industry leader. But it’s currently weighted toward efficiency gains, with broader business transformation and revenue upside still developing.</p>



<p class="wp-block-paragraph"><a href="https://tsecurity.de/weiterlesen/3657769/3685910/leadership-bottlenecks-slow-ai-adoption/" target="_blank" rel="noopener noreferrer">Another Deloitte survey</a> showed that the clearest results from AI were in productivity, with 66% of organizations reporting gains, and cost efficiency, with 40% saying AI reduces costs. “However, revenue impact is still emerging,” says Widener. “Only one in five companies says AI is driving top-line growth today.” But optimism prevails, with 74% expecting it to do so in the future.</p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[‘SEAL Team’ Confirms Netflix Release Date, Multiple Seasons Arrive This August]]></title>
<description><![CDATA[SEAL Team is officially heading to Netflix in the United States, with multiple seasons scheduled to arrive on August 18, 2026. The release gives military drama fans a major new series to watch before summer ends.



How Many Seasons Are Coming to Netflix?



Netflix has confirmed that more than o...]]></description>
<link>https://tsecurity.de/de/3684521/apple-ios-macos/seal-team-confirms-netflix-release-date-multiple-seasons-arrive-this-august/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3684521/apple-ios-macos/seal-team-confirms-netflix-release-date-multiple-seasons-arrive-this-august/</guid>
<pubDate>Tue, 21 Jul 2026 19:49:34 +0200</pubDate>
<content:encoded><![CDATA[SEAL Team is officially heading to Netflix in the United States, with multiple seasons scheduled to arrive on August 18, 2026. The release gives military drama fans a major new series to watch before summer ends.



How Many Seasons Are Coming to Netflix?



Netflix has confirmed that more than one season will become available, although the exact number has not been announced. The show has seven completed seasons, so Netflix has a large collection of episodes to choose from.



More information could arrive when Netflix publishes its full August 2026 release schedule. For now, viewers can expect at least two seasons when the series joins the service.



The Netflix release forms part of a licensing agreement involving several Paramount-owned shows. It follows other licensed dramas that have recently expanded beyond their original streaming homes.



What Is ‘SEAL Team’ About?



SEAL Team follows Bravo Team, an elite unit of United States Navy SEALs that handles dangerous missions around the world. The story covers mission planning, combat operations, family pressures and the lasting effects of military service.



David Boreanaz leads the cast as Jason Hayes, the experienced leader of Bravo Team. The main cast also includes Max Thieriot, Neil Brown Jr., A.J. Buckley, Toni Trucks and Jessica Paré.



The series first premiered on CBS in September 2017. It remained on broadcast television for its first four seasons before moving to Paramount+ during Season 5.



That move allowed the series to feature more mature storytelling, stronger language and darker mission-related themes. It eventually ended with its seventh and final season in October 2024. The complete series includes 114 episodes.



Is This the Animated ‘Seal Team’ Movie?



The incoming title is the live-action military drama starring David Boreanaz. It is separate from Netflix’s animated 2021 movie Seal Team, which follows a group of seals fighting sharks.



Multiple seasons of SEAL Team will begin streaming on Netflix US on August 18, 2026, giving existing fans another place to revisit Bravo Team’s missions while introducing the finished series to a wider audience.]]></content:encoded>
</item>
<item>
<title><![CDATA[10 AI Prompts I Use as an Engineering Manager (1:1s, Postmortems, Performance Reviews)]]></title>
<description><![CDATA[10 AI Prompts I Use as an Engineering Manager


I've managed engineering teams for long enough to know the pattern: half of the job is technical decisions, and the other half is the writing that surrounds those decisions. 1:1 agendas. Performance reviews. Postmortems. Status updates the VP insist...]]></description>
<link>https://tsecurity.de/de/3683634/sichere-programmierung/10-ai-prompts-i-use-as-an-engineering-manager-11s-postmortems-performance-reviews/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3683634/sichere-programmierung/10-ai-prompts-i-use-as-an-engineering-manager-11s-postmortems-performance-reviews/</guid>
<pubDate>Tue, 21 Jul 2026 14:14:49 +0200</pubDate>
<content:encoded><![CDATA[<h1>
  
  
  10 AI Prompts I Use as an Engineering Manager
</h1>

<p>I've managed engineering teams for long enough to know the pattern: half of the job is technical decisions, and the other half is the writing that surrounds those decisions. 1:1 agendas. Performance reviews. Postmortems. Status updates the VP insists on. Hiring rubrics that no one will ever read until it's time to argue about a candidate.</p>

<p>Here are the 10 prompts that actually made my job easier. Each one follows a four-part structure I'll explain at the end. Every example output below is real, edited only for length.</p>

<h2>
  
  
  1. The 1:1 Agenda That Surfaces the Real Topic
</h2>

<p>The biggest 1:1 mistake is walking in with your own agenda. This prompt flips it: it asks the model to generate what your report <em>probably</em> wants to talk about, based on what's happened since the last 1:1. You bring that draft, not a topic list.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Role: Staff engineer who has managed 20+ reports.
Context: I have a 30-minute 1:1 with [REPORT NAME] in two hours.
Their role is [ROLE]. Since our last 1:1 (one week ago):
- They shipped [THING SHIPPED].
- They raised a concern about [CONCERN].
- They were blocked on [BLOCKER].
- Their last 1:1 topic was [LAST TOPIC].
Constraints: Do NOT suggest topics I want to discuss.
Suggest only topics THEY are most likely to bring up —
including the one they're avoiding. Max 5 topics.
For each, write one sentence on why it's likely on their mind.
Output: A numbered list. The last item must be the
uncomfortable one (the promotion question, the burnout flag,
the conflict with a teammate). Label it "the one they won't raise first".
</code></pre>

</div>



<p><strong>Real output</strong> (report = mid-level IC, last week shipped a refactor they were nervous about):</p>

<blockquote>
<p><strong>1. The refactor postmortem.</strong> They want to know if the production hiccup on Thursday will be held against them.<br>
<strong>2. The new project assignment.</strong> You mentioned a new initiative; they're deciding whether to volunteer.<br>
<strong>3. The pair-programming request from the junior.</strong> They're unsure if it's a time sink or a growth move.<br>
<strong>4. The pay band question</strong> (they read a levels.fyi post this week).<br>
<strong>5. The one they won't raise first.</strong> They're quietly checking if you think they're senior material — and whether they should wait or push.</p>
</blockquote>

<p>That fifth item is what every 1:1 prompt should surface. The other four are the setup.</p>

<h2>
  
  
  2. The Performance Review Without the Praise Sandwich
</h2>

<p>Most performance reviews read like Mad Libs: "[Name] is a strong contributor who [generic verb] [generic noun]." This prompt forces specifics — and refuses the "areas for growth" hedge.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Role: Engineering manager writing a calibration-ready review.
Context: Write the review for [NAME], [LEVEL], over [PERIOD].
Their concrete work this period, in five bullets:
- [IMPACT 1 with a number]
- [IMPACT 2 with a number]
- [IMPACT 3]
- [BEHAVIOR 1 — how they operated]
- [BEHAVIOR 2 — how they operated]
Constraints: No sentence may contain the words "consistently",
"strong", "valued", or "team player". Every impact claim must
reference the number or be cut. The "areas for growth" section
must name ONE specific behavior, the situation it appeared in,
and the suggested replacement behavior. Do not write more than
one growth area.
Output: Two sections. "Impact" (3 sentences max) and
"One thing to change next period" (2 sentences max).
</code></pre>

</div>



<p><strong>Real output</strong> (impact = led migration that cut p95 latency 40%):</p>

<blockquote>
<p><strong>Impact:</strong> [Name] owned the API migration that reduced p95 latency from 420ms to 250ms (40%) and unblocked two downstream teams who had been rate-limiting around it. They ran the rollout in four feature-flagged stages, which meant the single rollback (stage 3) cost 20 minutes of degraded traffic instead of an outage. They also ran three brown-bag sessions that brought three other engineers to the point of shipping independently on the new pattern.</p>

<p><strong>One thing to change next period:</strong> In the Q3 design review, you presented three options without recommending one, which extended the meeting by 45 minutes and split the room. Next time, present your recommendation in the first two minutes and use the rest of the meeting to defend or revise it.</p>
</blockquote>

<p>The word "consistently" is a tell. If you can't name the specific instances, you don't have enough evidence for the review.</p>

<h2>
  
  
  3. The Architecture Decision Record That Survives the Meeting
</h2>

<p>Most ADRs die in the meeting where someone says "wait, did we consider X?" This prompt forces the alternatives section to be real, not decorative.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Role: Principal engineer writing an ADR for a skeptical audience.
Context: We are deciding [DECISION]. The proposed option is
[OPTION A: short description + one concrete reason we picked it].
The alternatives seriously considered are:
- [OPTION B]
- [OPTION C]
Constraints: For EACH alternative, write exactly three sentences:
(1) the scenario where it would have been the right call,
(2) the specific reason we rejected it, (3) the trigger that
would make us revisit it. No "this option was less optimal" —
name the failure mode.
Output: ADR with sections Status, Context, Decision, Consequences,
Alternatives. Max 400 words total.
</code></pre>

</div>



<p><strong>Real output</strong> (decision = adopt Postgres for the new billing service):</p>

<blockquote>
<p><strong>Status:</strong> Proposed<br>
<strong>Context:</strong> Billing service must be ACID-compliant, auditable, and support read replicas within 6 months.<br>
<strong>Decision:</strong> Postgres 16.<br>
<strong>Consequences:</strong> Team learns Postgres ops; we gain row-level security for tenant isolation; we inherit one more data store in the fleet.<br>
<strong>Alternatives:</strong><br>
<strong>MongoDB</strong> would have been right if billing documents were schemaless and append-only. Rejected because financial reconciliation requires transactions across multiple collections, which Mongo doesn't support cleanly. Revisit if the billing model becomes event-sourced only.<br>
<strong>DynamoDB</strong> would have been right if the access pattern were single-key lookups at high QPS. Rejected because our reporting workload scans by date range, which is the case Dynamo is worst at. Revisit if reporting moves to a separate OLAP store.</p>
</blockquote>

<p>The third sentence on each alternative — the revisit trigger — is what stops the "did we consider" re-litigation six months later.</p>

<h2>
  
  
  4. The Blameless Postmortem That Doesn't Drift
</h2>

<p>Postmortems drift into either blame or vague "process improvements." This prompt forces the five-whys structure and refuses generic action items.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Role: SRE-trained incident commander writing a blameless RCA.
Context: Incident on [DATE]. Summary: [WHAT HAPPENED, 2 SENTENCES].
Impact: [DURATION, USER COUNT, REVENUE OR DATA IMPACT].
Detection: [HOW WE FOUND OUT — alert, user report, etc.].
Timeline: [3-6 KEY EVENTS with timestamps].
Constraints: Use the five-whys structure for root cause.
Each "why" must point to a system or process, never a person.
No action item may be "add more monitoring" or "improve
communication" — name the specific dashboard, runbook, or
checklist. Exactly 5 action items, each with an owner and
a due date placeholder.
Output: Sections Summary, Impact, Timeline, Root Cause (5 whys),
Action Items.
</code></pre>

</div>



<p><strong>Real output</strong> (incident = checkout API 500s for 47 minutes):</p>

<blockquote>
<p><strong>Root Cause (five whys):</strong></p>

<ol>
<li>Why did checkout return 500s? The payment provider's webhook timeout leaked a database connection.</li>
<li>Why did the connection leak? The webhook handler didn't have a finally-block releasing the connection on timeout.</li>
<li>Why wasn't there a finally-block? The handler was copied from a non-transactional code path two quarters ago.</li>
<li>Why was copy-pasted code in production? The PR review checklist doesn't include "resource cleanup on timeout".</li>
<li>Why doesn't the checklist include it? The checklist was written for CRUD endpoints, not for external-webhook handlers — a class of endpoint added in the last 6 months.</li>
</ol>
</blockquote>

<p>Notice the fifth why points at the checklist, not the developer. That's what makes it blameless without making it useless.</p>

<h2>
  
  
  5. The On-Call Runbook From a Loose Slack Thread
</h2>

<p>Every team has the Slack thread where someone explained how to recover from a thing. It's never been written down. This prompt turns the thread into a runbook the next on-call can actually follow at 3am.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Role: On-call engineer who has been paged at 3am and needs a runbook.
Context: Here is the Slack thread where [EXPERT] explained
how to recover from [INCIDENT TYPE]:
"""
[PASTE THE SLACK THREAD VERBATIM, INCLUDING THE WRONG TURNS]
"""
Constraints: Produce a runbook with numbered steps. Each step
must be one action a single person can complete in under
5 minutes. Mark any step that requires a second pair of eyes
with "⚠ second person required". Include a "What NOT to do"
section with the wrong turns from the thread. No step may
reference "the usual way" or "the standard procedure" —
spell it out.
Output: Sections Detection, Immediate Action (numbered steps),
Verification, Rollback, What NOT to do.
</code></pre>

</div>



<p><strong>Real output</strong> (incident type = Redis cache corruption):</p>

<blockquote>
<p><strong>Immediate Action:</strong></p>

<ol>
<li>SSH to the cache node (see runbook-redis-access).</li>
<li>Run <code>redis-cli -h &lt;host&gt; -a &lt;password&gt; INFO keyspace</code> and screenshot the output. (This is your before-state.)</li>
<li>Identify the corrupted key prefix from the alert payload.</li>
<li>Run <code>redis-cli ... --scan --pattern '&lt;prefix&gt;*' | head -50</code> to list affected keys.</li>
<li>⚠ Second person required: Decide whether to flush the prefix (fast, loses cache) or delete individual keys (slow, safe). If in doubt, flush the prefix — cache is rebuildable.</li>
<li>Flush: <code>redis-cli ... EVAL "return redis.call('del', unpack(KEYS))" 0 &lt;prefix&gt;*</code> (wait — this is wrong, see What NOT to do #1).</li>
<li>Correct flush: <code>redis-cli ... --scan --pattern '&lt;prefix&gt;*' | xargs redis-cli ... del</code>
</li>
</ol>

<p><strong>What NOT to do:</strong></p>

<ol>
<li>Do NOT use <code>EVAL "return redis.call('del', unpack(KEYS))" 0 &lt;prefix&gt;*</code> — <code>unpack</code> truncates at 8000 keys and silently drops the rest. This is the bug that made the March incident worse.</li>
</ol>
</blockquote>

<p>The "What NOT to do" section is the most valuable part. Every Slack thread contains the wrong attempts — those wrong attempts are the actual lessons.</p>

<h2>
  
  
  6. The Sprint Retro That Produces ONE Experiment
</h2>

<p>Retros produce 12 action items that no one owns. This prompt forces one experiment with a kill criterion.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Role: Agile coach who has run 200 retros and is tired of
action-item graveyards.
Context: The team's retro board:
- What went well: [3 ITEMS]
- What didn't: [3 ITEMS]
- Ideas: [3 ITEMS]
Constraints: Pick exactly ONE idea. Frame it as an experiment
with: the hypothesis, the change, the measurement, and the
kill criterion (the signal that tells us to stop the experiment).
Do not produce more than one experiment. Do not produce a list
of "action items". The kill criterion is non-optional.
Output: One experiment card.
</code></pre>

</div>



<p><strong>Real output</strong> (retro idea = "shorter standups"):</p>

<blockquote>
<p><strong>Experiment: Timed standup with a 90-second cap per person</strong><br>
<strong>Hypothesis:</strong> Standups run over because no one enforces the per-person limit; a visible timer will make the limit real.<br>
<strong>Change:</strong> Use a phone timer passed around the circle. Each person gets 90 seconds. Timer resets between people.<br>
<strong>Measurement:</strong> Standup length (target: under 12 minutes for a 6-person team). Survey after 2 weeks: "did you feel heard?"<br>
<strong>Kill criterion:</strong> If average standup length is still over 15 minutes after 2 weeks, OR if "did you feel heard" drops below 60% yes, kill the experiment and revisit.</p>
</blockquote>

<p>The kill criterion is what makes an experiment different from a resolution. Resolutions drift; experiments get reviewed.</p>

<h2>
  
  
  7. The Status Update the VP Can Read in 20 Seconds
</h2>

<p>Your VP doesn't want the architecture. They want to know: are we on track, what's at risk, and do you need anything. This prompt enforces that.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Role: Engineering manager writing a weekly status update for
a VP who reads 30 of these every Friday.
Context: Team: [TEAM NAME]. Headcount: [N]. Quarter goal:
[ONE SENTENCE GOAL]. This week's work, in 5 bullets:
- [BULLET]
- [BULLET]
- [BULLET]
- [BULLET]
- [BULLET]
Constraints: Total length under 120 words. The first line
must be either "On track" or "At risk" — nothing else.
If "At risk", the second line must state the single biggest
risk and what you need to resolve it. No technical jargon
the VP would have to look up. No "making progress" or
"continuing to" — those are filler.
Output: 4 sections. Status (1 line), Shipped (3 bullets max),
Next week (3 bullets max), Needs (1 line or "none").
</code></pre>

</div>



<p><strong>Real output</strong>:</p>

<blockquote>
<p><strong>Status:</strong> On track<br>
<strong>Shipped:</strong> Checkout API cut p95 from 420ms to 250ms. Two downstream teams unblocked. Billing service schema frozen for Q3.<br>
<strong>Next week:</strong> Migrate staging traffic to new Postgres cluster. Final review of the on-call runbook rewrite. Hire closed — start date confirmed for the 15th.<br>
<strong>Needs:</strong> None.</p>
</blockquote>

<p>120 words. The VP reads it in 20 seconds. You get your Friday afternoon back.</p>

<h2>
  
  
  8. The Hiring Rubric From a Messy Job Description
</h2>

<p>Most job descriptions are a wishlist. Most interview rubrics inherit the wishlist and become uncalibratable. This prompt turns a vague JD into a rubric with testable criteria.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Role: Hiring manager who has debiased 50+ interview loops.
Context: Here is the job description:
"""
[PASTE THE JD]
"""
Constraints: Produce a rubric with exactly 4 signals.
For each signal: (1) the name, (2) how to test it in a
45-minute interview (specific question or exercise),
(3) what a "strong hire" answer looks like in 2 sentences,
(4) what a "no hire" answer looks like in 2 sentences.
Do not include "culture fit" as a signal. Do not include
"passion". Signals must be observable in the interview,
not inferred.
Output: A 4-row rubric table.
</code></pre>

</div>



<p><strong>Real output</strong> (JD = senior backend engineer, vague requirements):</p>

<blockquote>
<p><strong>1. Systems thinking under partial failure</strong><br>
Test: "Walk me through what happens when our checkout API returns 500 for 1% of requests but 200 for the rest. Where do you look first?"<br>
Strong hire: Asks about the request distribution first (time, user cohort, region) before jumping to logs. Names at least three hypotheses ranked by likelihood.<br>
No hire: Jumps to "restart the server" or "check the logs" without considering whether the 1% is a deploy, a feature flag, or a downstream provider.</p>

<p><strong>2. Code review judgment</strong><br>
Test: Show a 200-line PR with one subtle bug and one style issue. "What's your review comment?"<br>
Strong hire: Finds the bug or asks a question that would reveal it. Mentions the style issue last, or not at all.<br>
No hire: Leads with the style issue. Doesn't engage with the logic.</p>

<p><strong>3. Tradeoff communication</strong><br>
Test: "Pick a technical decision you made recently. Argue both sides."<br>
Strong hire: Can steelman the option they rejected. Names the specific signal that would flip the decision.<br>
No hire: Can only argue their own side. Cannot describe the alternative's strengths.</p>

<p><strong>4. Ownership of outcomes</strong><br>
Test: "Tell me about a thing that shipped and went wrong."<br>
Strong hire: Uses "I" for decisions and "we" for outcomes. Describes what they changed in their own process afterward.<br>
No hire: Blames the team, the requirements, or luck. No change to their own process.</p>
</blockquote>

<p>The "no culture fit, no passion" constraint is the key. Both of those are where bias hides. Observable signals are where calibration starts.</p>

<h2>
  
  
  9. The Tech-Debt Pitch for Non-Technical Stakeholders
</h2>

<p>Engineering says "we need to refactor." Product says "what does that buy us?" This prompt translates refactoring into business language without lying.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Role: Engineering manager pitching a tech-debt investment
to a product and finance audience.
Context: The tech debt is [DESCRIBE THE DEBT — what it is,
how it got there, what it currently costs us].
The audience cares about: velocity, risk, and cost.
They do not care about: code elegance, the "right way",
or what the framework authors recommend.
Constraints: No technical terms without an in-line
plain-English definition. The pitch must include:
(1) the current weekly cost in engineer-hours,
(2) the projected weekly cost if we do nothing for 6 months,
(3) the investment in engineer-weeks to fix it,
(4) the payback period, (5) the one risk of doing the work
that's worth naming. Total length under 250 words.
Output: A one-page pitch with those 5 labeled sections.
</code></pre>

</div>



<p><strong>Real output</strong> (tech debt = the billing-service ORM that doesn't support transactions):</p>

<blockquote>
<p><strong>Current weekly cost:</strong> ~12 engineer-hours across the team — roughly 1.5 engineer-days per week spent on manual reconciliation workarounds.<br>
<strong>Projected cost in 6 months (do nothing):</strong> ~22 hours/week. The workaround count grows roughly linearly with customer count, and we're adding ~40 customers/quarter.<br>
<strong>Investment to fix:</strong> 3 engineer-weeks (one engineer, full-time, for a quarter of a sprint cycle). Includes the migration, the rollback path, and the runbook.<br>
<strong>Payback period:</strong> ~11 weeks at the current run-rate; faster as we add customers.<br>
<strong>Risk worth naming:</strong> During the 3-week migration, the billing service will be in a hybrid state (old ORM for reads, new ORM for writes). A rollback bug in that window could require a manual reconciliation — the same work we're trying to eliminate.</p>
</blockquote>

<p>Numbers beat adjectives. The "risk worth naming" section is what gets the pitch approved — it's the line that signals you've thought about it.</p>

<h2>
  
  
  10. The Onboarding Doc a New Hire Can Actually Follow
</h2>

<p>Most onboarding docs were written by someone who forgot what it was like to be new. This prompt forces a day-1 / week-1 / month-1 structure with specific tasks.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Role: Engineering manager writing onboarding for a new hire
who starts Monday.
Context: Role: [ROLE]. Team: [TEAM]. Stack: [KEY TECH].
The new hire is at [LEVEL] and is expected to ship their
first PR within [TIMEFRAME].
Constraints: Structure as Day 1, Week 1, Month 1.
For each section, list the specific tasks (not "get set up" —
"clone repo X, run command Y, expect output Z"). Each task
must have an expected outcome so the new hire knows when
they're done. Include the names of the people they should
ask for help, not "your buddy" or "the team". No task may
take longer than half a day. Mark any task that requires
access with "🔑 request access on Friday before you start".
Output: 3 sections, max 15 tasks total.
</code></pre>

</div>



<p><strong>Real output</strong> (role = backend engineer, expected first PR in week 1):</p>

<blockquote>
<p><strong>Day 1</strong></p>

<ol>
<li>🔑 Request access to the staging cluster, the on-call Slack channel, and the billing repo (ask Priya in #team-payments).</li>
<li>Clone the billing-service repo. Run <code>make dev</code>. Expected: local server on :8080, health check at /health returns 200.</li>
<li>Read the ADR on the Postgres decision (link in the repo README). Expected: you can name the one alternative we rejected and why.</li>
<li>1:1 with your manager (that's me) at 3pm. Bring one question.</li>
</ol>

<p><strong>Week 1</strong></p>

<ol>
<li>Pick up the "good first issue" tagged in the repo. Expected: PR open by Thursday, merged by Friday.</li>
<li>Shadow one on-call rotation (ask Marco). Expected: you understand what pages and what doesn't.</li>
<li>Read two postmortems from the last quarter (linked in the runbook repo). Expected: you can describe one systemic fix.</li>
</ol>

<p><strong>Month 1</strong></p>

<ol>
<li>Own a small feature end-to-end. Expected: design doc reviewed, PR merged, deployed to staging.</li>
<li>Run a code review on someone else's PR (ask to be assigned). Expected: at least one substantive comment, not just nits.</li>
<li>Present a 10-minute talk at the team meeting on something you learned. Expected: slides or a doc, not just talking.</li>
</ol>
</blockquote>

<p>The "expected outcome" on every task is the whole prompt. Without it, the new hire stares at "get set up" and doesn't know if they're done.</p>




<h2>
  
  
  The Structure Behind All 10 Prompts
</h2>

<p>Every prompt above follows the same four-part structure. Once you internalize it, you can write your own.</p>

<p><strong>Role</strong> — Not "act as an engineering manager" — "act as a staff engineer who has managed 20+ reports". The specificity of the role is the biggest single lever on output quality.</p>

<p><strong>Context</strong> — Concrete inputs: the report's name and level, the incident timeline, the JD verbatim. Vague context produces vague output.</p>

<p><strong>Constraints</strong> — This is where most prompts fail. A constraint is a hard rule: word count, banned words, required structure, a specific first sentence. Constraints turn generic output into something you'd actually ship.</p>

<p><strong>Output format</strong> — "A 4-row rubric table." "Five numbered topics." "A one-page pitch with five labeled sections." Without an output format, you get paragraphs you have to edit down.</p>

<h2>
  
  
  How I Tested Each Prompt
</h2>

<p>I didn't ship any of these on the first output. Each one went through the same test:</p>

<ol>
<li>
<strong>Run it three times</strong> with the same inputs. If the outputs vary wildly, the prompt is too loose — add a constraint.</li>
<li>
<strong>Run it on a different situation</strong> than the one it was written for. If it only works for one team, it's overfit — generalize the context.</li>
<li>
<strong>Read the output aloud</strong> to a peer. If they can guess it was AI-written, the prompt failed. Good output reads like you wrote it under deadline.</li>
<li>
<strong>Cut anything that could apply to any team.</strong> "Improve communication" applies to everyone and helps no one. Specificity is the test.</li>
</ol>

<h2>
  
  
  The Full Library
</h2>

<p>Every prompt above is open-sourced — but it's 10 out of a larger library I use for the writing part of engineering management. The full set covers 1:1s, performance reviews, postmortems, ADRs, hiring, onboarding, tech-debt pitches, sprint planning, stakeholder updates, and the inevitable skip-level meeting.</p>

<p>If you want the whole library rather than copying prompts one at a time:</p>

<ul>
<li>
<strong>Developer Product-Launch Prompt Pack</strong> ($9) — 7 prompts for launch tweets, Show HN posts, changelogs, release notes. The entry-level pack. <a href="https://tsecurity.de/weiterlesen/3655493/3683634/10-ai-prompts-i-use-as-an-engineering-manager-11s-postmortems-performance-reviews/" target="_blank" rel="noopener noreferrer">Get it on Gumroad →</a>
</li>
<li>
<strong>Developer Productivity Prompt Library</strong> ($49) — 30 prompts for code reviews, PR descriptions, bug reports, test cases, API docs. <a href="https://tsecurity.de/weiterlesen/3655493/3683634/10-ai-prompts-i-use-as-an-engineering-manager-11s-postmortems-performance-reviews/" target="_blank" rel="noopener noreferrer">Get it on Gumroad →</a>
</li>
<li>
<strong>SaaS Marketing Copy Prompt Pack</strong> ($49) — 25 prompts for landing pages, ad creative, objection handling, email sequences. <a href="https://tsecurity.de/weiterlesen/3655493/3683634/10-ai-prompts-i-use-as-an-engineering-manager-11s-postmortems-performance-reviews/" target="_blank" rel="noopener noreferrer">Get it on Gumroad →</a>
</li>
<li>
<strong>AI Startup Operations Prompt System</strong> ($199) — 50+ prompts across 10 workflows for running an engineering org with AI. The one most relevant to the prompts in this article. <a href="https://tsecurity.de/weiterlesen/3655493/3683634/10-ai-prompts-i-use-as-an-engineering-manager-11s-postmortems-performance-reviews/" target="_blank" rel="noopener noreferrer">Get it on Gumroad →</a>
</li>
<li>
<strong>AI Business Transformation Playbook</strong> ($999) — 100+ prompts and 12 workflows for rolling out AI across a whole company. <a href="https://tsecurity.de/weiterlesen/3655493/3683634/10-ai-prompts-i-use-as-an-engineering-manager-11s-postmortems-performance-reviews/" target="_blank" rel="noopener noreferrer">Get it on Gumroad →</a>
</li>
</ul>

<p>Or browse the <a href="https://tsecurity.de/weiterlesen/3655493/3683634/10-ai-prompts-i-use-as-an-engineering-manager-11s-postmortems-performance-reviews/" target="_blank" rel="noopener noreferrer">full storefront</a> — every product has a free sample you can read before buying.</p>




<p>That's the set. If you found even one prompt here useful, the easiest next step is the $9 launch pack — it's the lowest-risk way to see if the format works for you.</p>

<p><em>What EM prompt would you want next — skip-level prep, promotion packets, or RIF planning? I read the comments.</em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[🚀How Two Computers Create a Secret Without Ever Sharing It]]></title>
<description><![CDATA[For quite a time, I was thinking: how does encryption really work?

Like, if I want to send a secret request (like an auth token) to a server, but the network channel is insecure. Thousands of people can see what we are sending.

We can't even share a secret password (key) to each other beforehan...]]></description>
<link>https://tsecurity.de/de/3683575/sichere-programmierung/how-two-computers-create-a-secret-without-ever-sharing-it/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3683575/sichere-programmierung/how-two-computers-create-a-secret-without-ever-sharing-it/</guid>
<pubDate>Tue, 21 Jul 2026 13:47:20 +0200</pubDate>
<content:encoded><![CDATA[<p>For quite a time, I was thinking: how does encryption really work?</p>

<p>Like, if I want to send a secret request (like an auth token) to a server, but the network channel is insecure. Thousands of people can see what we are sending.</p>

<p>We can't even share a secret password (key) to each other beforehand. Because if we send the password over the network, everyone else will see it and use it too.</p>

<p>So how on earth do we connect securely?</p>

<p>Then I researched and found out about the legendary minds who solved this. Let's break it down—this is going to be a fun topic.</p>




<h2>
  
  
  🎨 The Paint Color Analogy
</h2>

<p>Imagine you and I want to agree on a secret color, but a spy is watching every single color we pass to each other.</p>

<p>Here is the color theory trick:</p>

<ul>
<li>  <strong>Public Agreement:</strong> We openly agree on a starting color, let's say <strong>Yellow</strong>. The spy hears this.</li>
<li>  <strong>Private Secrets:</strong> I choose a secret color (<strong>Red</strong>). You choose a secret color (<strong>Blue</strong>). We keep these secret in our minds.</li>
<li>  <strong>The Mix:</strong> I mix my secret Red with the public Yellow to get <strong>Orange</strong>. You mix your secret Blue with the public Yellow to get <strong>Green</strong>.</li>
<li>  <strong>The Exchange:</strong> We send our mixed colors (Orange and Green) to each other. The spy intercepts them. But the spy cannot easily separate the mixed colors to find our private Red or Blue.</li>
<li>  <strong>The Match:</strong> I take your Green (Blue+Yellow) and add my secret Red to it. You take my Orange (Red+Yellow) and add your secret Blue to it.</li>
</ul>

<p><strong>Result:</strong> Both of us now have the exact same color mixture: <strong>Red + Blue + Yellow (Brown)</strong>.</p>

<p>We just agreed on a shared secret color without ever sending our private secret colors over the network!</p>




<h2>
  
  
  🗺️ The Connection Flow
</h2>

<p>Here is the exact step-by-step lifecycle of how this handshake and data encryption works under the hood:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>================================================================================
PHASE 1: THE TLS HANDSHAKE (Color Exchange) - Tunnel Building
Goal: Agree on the "Brown Key" without hackers reading our private colors.
================================================================================

 GOLU (Browser)                                                 SIA (Web Server)
 [Private Color: RED]                                         [Private Color: BLUE]
          |                                                             |
          | ----- 1. ClientHello (Agree on public color: YELLOW) -----&gt; |
          |                                                             |
          | &lt;---- 2. ServerHello (Confirm public color: YELLOW) ------- |
          |                                                             |
          | 3. Golu mixes:                                              |
          |    RED + YELLOW = ORANGE                                    |
          |                                                             |
          | ----- 4. Golu sends mixed ORANGE -------------------------&gt; |
          |                                                             |
          |                                           5. Sia mixes:     |
          |                                              BLUE + YELLOW = GREEN
          |                                                             |
          | &lt;---- 6. Sia sends mixed GREEN ---------------------------- |
          |                                                             |
          | 7. Golu computes key:                                       |
          |    RED + GREEN (Sia's mix)                                  |
          |    = BROWN KEY                                              |
          |                                           8. Sia computes key:
          |                                              BLUE + ORANGE (Golu's mix)
          |                                              = BROWN KEY
          |                                                             |
================================================================================
RESULT: Both have the same "BROWN KEY". Secure tunnel is OPEN!
================================================================================

          |                                                             |
          |                                                             |

================================================================================
PHASE 2: SECURE APPLICATION SESSION (Sending the Auth Token)
Goal: Send the sensitive token encrypted so only Golu &amp; Sia understand it.
================================================================================

 GOLU (Browser)                                                 SIA (Web Server)
 [Token: "XYZ"]                                               [Database Check]
          |                                                             |
          | 1. Encrypt with BROWN KEY:                                  |
          |    "XYZ" + BROWN = "x&amp;9#p"                                  |
          |                                                             |
          | ----- 2. Sends Encrypted Request ("x&amp;9#p") ---------------&gt; |
          |                                                             |
          |                                           3. Decrypts with BROWN KEY:
          |                                              "x&amp;9#p" + BROWN = "XYZ"
          |                                                             |
          |                                           4. Database Lookup:
          |                                              Is "XYZ" valid? YES!
          |                                                             |
          | &lt;---- 5. Sends Encrypted Status ("Logged In") ------------- |
</code></pre>

</div>






<p>In computers, we don't mix paint. We use a mathematical trick called <strong>Modulo Arithmetic</strong>.</p>

<p>Because finding the private key from the public key is mathematically impossible for computers in a reasonable timeframe (known as the <strong>Discrete Logarithm Problem</strong>), the spy is completely locked out.</p>




<h2>
  
  
  🛡️ The Major Limitation: Man-in-the-Middle (MITM)
</h2>

<p>While Diffie-Hellman is legendary, it has one critical vulnerability: <strong>It does not verify identity.</strong></p>

<p>If a hacker sits in the middle of our connection, they can intercept Golu's public key, establish a secure tunnel with Golu pretending to be Sia, and establish another secure tunnel with Sia pretending to be Golu. </p>

<p>This is the <strong>Man-in-the-Middle (MITM) attack</strong>. Diffie-Hellman encrypts the traffic, but it doesn't prove <em>who</em> you are talking to. </p>

<p>To solve this, modern HTTPS combines Diffie-Hellman with <strong>Digital Certificates (SSL)</strong>. The server must provide a cryptographic certificate signed by a trusted authority to prove that "Sia" is actually Sia, not a hacker in the middle.</p>




<p>💬 <strong>What is the single systems concept that blew your mind when you first learned it? Let me know in the comments!</strong></p>

<p>If you liked this simple breakdown, follow me for more interesting systems engineering topics.</p>

<p>— <strong>Golu</strong></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[How LINE MINI App Service Notification Tokens Work (and Why You Must Rotate Them)]]></title>
<description><![CDATA[LINE MINI App service messages are not ordinary push notifications.

They use a user-bound, action-specific notification token that changes after every successful send. If your application keeps using the original token, later reminders can fail even when the template and channel credentials are ...]]></description>
<link>https://tsecurity.de/de/3683099/sichere-programmierung/how-line-mini-app-service-notification-tokens-work-and-why-you-must-rotate-them/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3683099/sichere-programmierung/how-line-mini-app-service-notification-tokens-work-and-why-you-must-rotate-them/</guid>
<pubDate>Tue, 21 Jul 2026 11:00:02 +0200</pubDate>
<content:encoded><![CDATA[<p>LINE MINI App service messages are not ordinary push notifications.</p>

<p>They use a user-bound, action-specific notification token that changes after every successful send. If your application keeps using the original token, later reminders can fail even when the template and channel credentials are correct.</p>

<p>This guide explains the complete flow: issuing the token, sending an approved template, saving the renewed token, and handling retries safely.</p>

<h2>
  
  
  Prerequisites
</h2>

<p>Before implementing the API flow, make sure:</p>

<ul>
<li>Your LINE MINI App is verified for production use.</li>
<li>The service-message template has been approved.</li>
<li>The message confirms or responds to an action completed by the user.</li>
<li>The channel access token is stored only on your server.</li>
</ul>

<p>Unverified MINI Apps can test service messages in a Developing channel, but they cannot send production service messages from a Published channel.</p>

<h2>
  
  
  Understand the three tokens
</h2>

<p>Three different credentials are involved in the flow.</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Credential</th>
<th>Purpose</th>
<th>Important lifecycle rule</th>
</tr>
</thead>
<tbody>
<tr>
<td>LIFF access token</td>
<td>Identifies the current LINE user</td>
<td>Exchange it shortly after the user completes the action</td>
</tr>
<tr>
<td>Channel access token</td>
<td>Authorizes server-side LINE API calls</td>
<td>Never expose it to the browser</td>
</tr>
<tr>
<td>Service notification token</td>
<td>Authorizes notifications for one user action</td>
<td>Replace it after every successful send</td>
</tr>
</tbody>
</table></div>

<p>A LIFF access token can be obtained in the MINI App with:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">liffAccessToken</span> <span class="o">=</span> <span class="nx">liff</span><span class="p">.</span><span class="nf">getAccessToken</span><span class="p">();</span>
</code></pre>

</div>



<p>Send this value to your backend over HTTPS after the reservation, purchase, check-in, or other approved action succeeds.</p>

<p>Do not write the LIFF access token or service notification token to application logs.</p>

<h2>
  
  
  Step 1: Issue a service notification token
</h2>

<p>Your backend exchanges the LIFF access token for a service notification token:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>curl <span class="nt">-X</span> POST https://api.line.me/message/v3/notifier/token <span class="se">\</span>
  <span class="nt">-H</span> <span class="s2">"Authorization: Bearer </span><span class="k">${</span><span class="nv">LINE_CHANNEL_ACCESS_TOKEN</span><span class="k">}</span><span class="s2">"</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
  <span class="nt">-d</span> <span class="s2">"{</span><span class="se">\"</span><span class="s2">liffAccessToken</span><span class="se">\"</span><span class="s2">:</span><span class="se">\"</span><span class="k">${</span><span class="nv">LIFF_ACCESS_TOKEN</span><span class="k">}</span><span class="se">\"</span><span class="s2">}"</span>
</code></pre>

</div>



<p>A successful response looks like this:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight json"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"notificationToken"</span><span class="p">:</span><span class="w"> </span><span class="s2">"34c11a03-b726-49e3-8ce0-949387a9f531"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"expiresIn"</span><span class="p">:</span><span class="w"> </span><span class="mi">31536000</span><span class="p">,</span><span class="w">
  </span><span class="nl">"remainingCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">5</span><span class="p">,</span><span class="w">
  </span><span class="nl">"sessionId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"xD06R2407210008"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>

</div>



<p>Store the following values:</p>

<ul>
<li><code>notificationToken</code></li>
<li><code>expiresIn</code></li>
<li><code>remainingCount</code></li>
<li><code>sessionId</code></li>
<li>Your internal order, reservation, or action ID</li>
</ul>

<p>The token is bound to one user and one action session. It is not a reusable user identifier.</p>

<p>One LIFF access token can issue only one service notification token, so perform the exchange once and persist the result.</p>

<h2>
  
  
  Step 2: Send an approved template
</h2>

<p>Use the service notification token with the official send endpoint:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>curl <span class="nt">-X</span> POST <span class="s2">"https://api.line.me/message/v3/notifier/send?target=service"</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s2">"Authorization: Bearer </span><span class="k">${</span><span class="nv">LINE_CHANNEL_ACCESS_TOKEN</span><span class="k">}</span><span class="s2">"</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s2">"Content-Type: application/json"</span> <span class="se">\</span>
  <span class="nt">-d</span> <span class="s1">'{
    "templateName": "thankyou_msg_en",
    "params": {
      "date": "2026-07-21",
      "username": "Brown &amp; Cony"
    },
    "notificationToken": "34c11a03-b726-49e3-8ce0-949387a9f531"
  }'</span>
</code></pre>

</div>



<p>A few details are easy to miss:</p>

<ul>
<li>
<code>target=service</code> is required.</li>
<li>
<code>templateName</code> must exactly match an approved template.</li>
<li>The keys inside <code>params</code> must match the variables defined by that template.</li>
<li>If the template has no variables, <code>params</code> is still required and should be <code>{}</code>.</li>
</ul>

<h2>
  
  
  Step 3: Save the renewed token
</h2>

<p>This is the most important implementation rule:</p>

<blockquote>
<p>After every successful send, replace the stored notification token with the new token returned by LINE.</p>
</blockquote>

<p>The response contains an updated token and counters:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight json"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"notificationToken"</span><span class="p">:</span><span class="w"> </span><span class="s2">"renewed-token-value"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"expiresIn"</span><span class="p">:</span><span class="w"> </span><span class="mi">31536000</span><span class="p">,</span><span class="w">
  </span><span class="nl">"remainingCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w">
  </span><span class="nl">"sessionId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"xD06R2407210008"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>

</div>



<p>Do not schedule another reminder until the renewed token has been saved successfully.</p>

<p>A safe sequence is:</p>

<ol>
<li>Lock or version the action record.</li>
<li>Send the approved service-message template.</li>
<li>Receive the successful response.</li>
<li>Replace the stored notification token.</li>
<li>Update <code>remainingCount</code> and <code>expiresIn</code>.</li>
<li>Commit the database transaction.</li>
<li>Schedule the next reminder.</li>
</ol>

<p>This prevents two workers from sending with the same token concurrently.</p>

<h2>
  
  
  Example storage model
</h2>

<p>A minimal action record could look like this:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight json"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"actionId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"order_12345"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"sessionId"</span><span class="p">:</span><span class="w"> </span><span class="s2">"xD06R2407210008"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"notificationToken"</span><span class="p">:</span><span class="w"> </span><span class="s2">"encrypted-token-value"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"remainingCount"</span><span class="p">:</span><span class="w"> </span><span class="mi">4</span><span class="p">,</span><span class="w">
  </span><span class="nl">"expiresAt"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2027-07-21T10:00:00Z"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"version"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>

</div>



<p>Encrypt the notification token at rest and use the <code>version</code> field—or an equivalent database lock—to prevent concurrent updates.</p>

<h2>
  
  
  Handling errors and retries
</h2>

<p>Treat notification tokens as rotating credentials, not permanent addresses.</p>

<h3>
  
  
  HTTP 400
</h3>

<p>Check:</p>

<ul>
<li>Request body format</li>
<li>Template name</li>
<li>Template variables</li>
<li>Recipient state</li>
<li>Current notification token</li>
</ul>

<p>Do not repeatedly retry the same invalid request.</p>

<h3>
  
  
  HTTP 401
</h3>

<p>Refresh or verify the server-side channel credential.</p>

<p>If the LIFF access token or service notification token is invalid, start a new eligible user-action flow instead of replaying it indefinitely.</p>

<h3>
  
  
  HTTP 403
</h3>

<p>Confirm:</p>

<ul>
<li>The channel is authorized for the operation</li>
<li>The MINI App has the required status</li>
<li>The template exists and is approved</li>
</ul>

<h3>
  
  
  Concurrent sends
</h3>

<p>Never allow two workers to spend the same notification token simultaneously. Use a database lock, compare-and-swap update, or version check around the send operation.</p>

<h2>
  
  
  Message limits
</h2>

<p>A newly issued token is normally valid for up to one year and starts with a limited number of sends.</p>

<p>The reviewed use case may have a different limit, so your application should always treat the latest <code>remainingCount</code> returned by LINE as the runtime source of truth.</p>

<p>Service messages must remain tied to the original user action. They are designed for cases such as:</p>

<ul>
<li>Reservation confirmations</li>
<li>Order results</li>
<li>Shipping updates</li>
<li>Reminders related to the original action</li>
</ul>

<p>They are not intended for:</p>

<ul>
<li>Advertising</li>
<li>Coupons</li>
<li>Product promotions</li>
<li>General announcements</li>
<li>Free-form customer support conversations</li>
</ul>

<h2>
  
  
  Implementation checklist
</h2>

<p>Before releasing the integration, verify:</p>

<ul>
<li>[ ] The LIFF access token is collected after an eligible user action</li>
<li>[ ] Token exchange happens on the server</li>
<li>[ ] Channel credentials are never exposed to the browser</li>
<li>[ ] Tokens are not written to application logs</li>
<li>[ ] The exact approved template name is used</li>
<li>[ ] <code>target=service</code> is included</li>
<li>[ ] The renewed notification token is saved after every send</li>
<li>[ ] <code>remainingCount</code> is checked before scheduling another message</li>
<li>[ ] Concurrent sends are prevented</li>
<li>[ ] Failed requests use bounded, reason-specific retry logic</li>
</ul>

<h2>
  
  
  Conclusion
</h2>

<p>The API calls themselves are straightforward. The difficult part is managing the notification token correctly.</p>

<p>Think of it as a rotating credential associated with one user action:</p>

<ol>
<li>Obtain a fresh LIFF access token.</li>
<li>Exchange it on the server.</li>
<li>Send an approved template.</li>
<li>Save the renewed notification token.</li>
<li>Use the latest <code>remainingCount</code> for future decisions.</li>
</ol>

<p>If you get the rotation and concurrency rules right, follow-up service messages become much more predictable.</p>

<h2>
  
  
  Sources
</h2>

<ul>
<li><a href="https://tsecurity.de/weiterlesen/3654958/3683099/how-line-mini-app-service-notification-tokens-work-and-why-you-must-rotate-them/" target="_blank" rel="noopener noreferrer">Sending service messages</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3654958/3683099/how-line-mini-app-service-notification-tokens-work-and-why-you-must-rotate-them/" target="_blank" rel="noopener noreferrer">LINE MINI App API reference</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3654958/3683099/how-line-mini-app-service-notification-tokens-work-and-why-you-must-rotate-them/" target="_blank" rel="noopener noreferrer">Service operation and message limits</a></li>
</ul>




<p>Originally published on <a href="https://tsecurity.de/weiterlesen/3654958/3683099/how-line-mini-app-service-notification-tokens-work-and-why-you-must-rotate-them/" target="_blank" rel="noopener noreferrer">UnifyPort</a>.</p>

<p><em>This article was prepared with AI assistance for language and structure, then technically reviewed and verified by the author.</em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Scaling Your Pokémon Team: When Your AI System Outgrows Its Original Design]]></title>
<description><![CDATA[In Part 1, I built a personal AI orchestration system: one orchestrator (Metagross) routes tasks to specialized agents. In Part 2, I improved it by adding a circuit breaker, a shared journal, constructive tension between agents, and a harness to verify routing.

Since then I've continued to make ...]]></description>
<link>https://tsecurity.de/de/3682111/sichere-programmierung/scaling-your-pokmon-team-when-your-ai-system-outgrows-its-original-design/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3682111/sichere-programmierung/scaling-your-pokmon-team-when-your-ai-system-outgrows-its-original-design/</guid>
<pubDate>Mon, 20 Jul 2026 22:26:25 +0200</pubDate>
<content:encoded><![CDATA[<p>In <a href="https://tsecurity.de/weiterlesen/3653970/3682111/scaling-your-pokmon-team-when-your-ai-system-outgrows-its-original-design/" target="_blank" rel="noopener noreferrer">Part 1</a>, I built a personal AI orchestration system: one orchestrator (Metagross) routes tasks to specialized agents. In <a href="https://tsecurity.de/weiterlesen/3653970/3682111/scaling-your-pokmon-team-when-your-ai-system-outgrows-its-original-design/" target="_blank" rel="noopener noreferrer">Part 2</a>, I improved it by adding a circuit breaker, a shared journal, constructive tension between agents, and a harness to verify routing.</p>

<p>Since then I've continued to make even more improvements. The rapid growth exposed problems I didn't anticipate, requiring infrastructure changes. </p>

<h2>
  
  
  1. The Roster Expanded
</h2>

<p>My original agents covered my core workflow, but gaps kept showing up. Edge cases exposed tasks that didn't quite fit under any agent. I needed to add some new Pokémon: </p>

<p><strong>Genesect</strong> is a coding agent who writes code, debugs, explains stack traces, and does code review. </p>

<p><strong>Scizor</strong> is an adversarial code reviewer who does audits and checks for correctness. </p>

<p><strong>Jigglypuff</strong> helps with conference talks and CFPs, specifically talk structure, slide outlines, speaker notes, and Q&amp;A prep. </p>

<p>But now that I had even more agents, I found that Metagross, the orchestrator, couldn't reliably know what each agent could do from memory alone. Routing decisions were getting fuzzy, especially with edge cases. It couldn't always tell if, for example, the ask was a coding task or a research task. </p>

<p>The fix was a capability registry, which is a <code>registry.json</code> file that Metagross reads at session start. Each agent has an entry with their capabilities and task types:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight json"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"genesect"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Coding agent"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"capabilities"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"write_code"</span><span class="p">,</span><span class="w"> </span><span class="s2">"debug"</span><span class="p">,</span><span class="w"> </span><span class="s2">"explain_code"</span><span class="p">,</span><span class="w"> </span><span class="s2">"refactor"</span><span class="p">,</span><span class="w"> </span><span class="s2">"code_review"</span><span class="p">,</span><span class="w"> </span><span class="s2">"stack_trace_analysis"</span><span class="p">],</span><span class="w">
  </span><span class="nl">"taskTypes"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"coding"</span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>

</div>



<p>Now when a task is ambiguous, Metagross consults the registry instead of guessing. The routing logic is still in the prompt, but the registry is the source of truth for what each agent actually handles. Adding a new agent means updating one JSON file, not rewriting the orchestrator prompt.</p>

<p>I also needed to extend the constructive tension pattern from Part 2 so that after Genesect writes code, Metagross automatically routes to Scizor for review before returning the result.</p>

<h2>
  
  
  2. The Journal Became a Liability
</h2>

<p>The shared journal I added in part 2 was one of the best additions to the system. Agents write context when they finish, read it before they start, so handoffs don't lose information.</p>

<p>The problem: it kept growing. By the time I noticed, <code>agent-journal.md</code> was over 240KB of prose. Every agent read the full file at the start of every session, resulting in my context window being half full before I even started. </p>

<p>I made two fixes:</p>

<p><strong><code>query-journal.sh</code></strong>: instead of reading the full journal, agents query it. They pass keywords, a date range, or a task type, and get back only the relevant entries:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>bash query-journal.sh <span class="nt">--keywords</span> <span class="s2">"react native sdk"</span> <span class="nt">--limit</span> 10
</code></pre>

</div>



<p>The journal protocol in every agent's prompt now says: <em>do NOT read the full journal file. Use query-journal.sh.</em> That one change cut context load significantly.</p>

<p><strong><code>archive-journal.sh</code></strong>: a script that moves entries older than 7 days into monthly archive files (<code>agent-journal-archive-2026-04.md</code>). It runs automatically when the active journal exceeds 30 entries, and there's a monthly cron job as a backup. The active journal stays lean. Old context is preserved but out of the way.</p>

<p>The archival script also prunes low-value entries from the archive. Research, analysis, review, writing, and planning entries are always kept. Purely procedural entries like environment setup, config tweaks, or build commands get dropped if they contain no learnings. For coding tasks, the script looks for value signals like bugs, root causes, design decisions, workarounds, gaps, limitations, and if none are present, the entry goes.</p>

<p>I also added two supporting structures:</p>

<p><strong><code>state.json</code></strong>: a shared key-value store for facts that multiple agents need to know and that don't belong in the journal. Current SDK version, active projects, known bugs. Agents read it instead of re-deriving the same facts from journal entries. It's a small file that stays current:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight json"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"current_sdk_version"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"value"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.23.6941"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"source"</span><span class="p">:</span><span class="w"> </span><span class="s2">"agent-journal.md — 2026-04-23T09:50-mew"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"last_updated"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2026-04-23T09:50-05:00"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"updated_by"</span><span class="p">:</span><span class="w"> </span><span class="s2">"mew"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>

</div>



<p><strong><code>artifacts/</code></strong>: a directory for outputs that agents produce and other agents might need later. Instead of re-generating the same research or draft, an agent can check artifacts first. The journal entry points to the artifact path.</p>

<p>The journal is still the coordination layer, but now it's a lean coordination layer instead of a growing monolith.</p>

<h2>
  
  
  3. Skills: Domain Knowledge Without Bloating Prompts
</h2>

<p>Some agents need specialized knowledge to do their job well. Genesect and Scizor both often work with React Native code. They need to know current best practices, common migration patterns, upgrade paths.</p>

<p>I could put that knowledge directly in their system prompts, but prompts are already doing a lot of work: defining role, behavior, tools, journal protocol, self-improvement loop. Stuffing domain knowledge in there makes them harder to maintain and harder to update when the knowledge changes.</p>

<p>The solution was a <code>skills/</code> directory. Each skill is a focused markdown file:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>skills/
  react-native-best-practices.md
  react-native-brownfield-migration.md
  upgrading-react-native.md
  github.md
  github-actions.md
</code></pre>

</div>



<p>Agents load the skills relevant to their work as resources, separate from their core prompt. When React Native releases a new version and the migration guidance changes, I update one file. Every agent that uses that skill gets the update automatically.</p>

<p>Skills are also composable. Genesect loads the coding skills. Scizor loads the same ones plus the review-specific context. Alakazam can load a skill when researching a topic it needs background on. The knowledge lives in one place and gets shared across agents that need it.</p>

<p>This is the same principle as scoped tool access from Part 1, agents only get what they need, but applied to knowledge instead of tools.</p>

<h2>
  
  
  4. The Test Harness Evolved
</h2>

<p>In Part 2, I built a test harness with 11 routing tests. The question it answered was: <em>does Metagross send the right task to the right agent?</em></p>

<p>That's necessary but not sufficient. Routing correctly to Alakazam doesn't mean Alakazam produced good research. Routing correctly to Mew doesn't mean the blog draft followed the style guide.</p>

<p>The harness now has two layers:</p>

<p>Layer 1: Routing and structure tests (the original PromptFoo harness). There are 17 tests now, which catch regressions in delegation logic and output structure.</p>

<p>Layer 2: Quality evals is a separate <code>evals/</code> directory with LLM-as-judge rubrics that test whether agent outputs are actually good. There are five evals:</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Eval</th>
<th>What it tests</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>01-constructive-tension</code></td>
<td>Slowking fires after Alakazam and actually validates</td>
</tr>
<tr>
<td><code>02-alakazam-includes-sources</code></td>
<td>Research output cites primary sources, not vague "studies show"</td>
</tr>
<tr>
<td><code>03-slowking-validates-not-echoes</code></td>
<td>Slowking catches wrong claims, doesn't just agree</td>
</tr>
<tr>
<td><code>04-research-output-quality</code></td>
<td>LLM-as-judge rubric: factual grounding, source quality, completeness, actionability</td>
</tr>
<tr>
<td><code>05-writing-style-compliance</code></td>
<td>LLM-as-judge rubric: direct, no filler, no em dashes, no corporate jargon</td>
</tr>
</tbody>
</table></div>

<p>Each eval has a <code>task.md</code> (what to test and why) and a <code>grader.sh</code> (runs the agent, then runs the judge). The judge scores on a 1–5 rubric across four dimensions. Pass threshold: average ≥ 3.5. </p>

<p>The routing tests run fast and catch structural regressions. The quality evals run on-demand and catch output degradation when an agent starts producing technically correct but actually bad output. </p>

<h2>
  
  
  5. The System Now Manages Itself
</h2>

<p>The original system required me to manage it, but now it manages more on its own.</p>

<p><strong>Delegation depth limit.</strong> Metagross tracks how deep the delegation chain is. If <code>delegationDepth &gt;= 3</code>, it stops delegating and surfaces a blocker instead of spiraling. This catches runaway chains before they waste tokens and time.</p>

<p><strong>Backpressure warning.</strong> Metagross tracks delegations vs. completions within a session. If tasks delegated is more than 2x tasks completed, it surfaces a warning. Something is stuck or looping, and I should know about it.</p>

<p><strong>Parallel execution.</strong> When a task has independent subtasks, like research and a calendar check, Metagross delegates them in parallel instead of sequentially. The prompt explicitly identifies when parallelization applies and when it doesn't.</p>

<p><strong>Monthly archival via cron.</strong> The journal archives itself once a week and moves old entries out of the active journal.</p>

<p><strong>Post-delegation suggestions.</strong> After each agent completes, Metagross suggests a natural next step. After Alakazam: "Want me to validate these findings?" After Genesect: "Want me to review this code, or create a task to track it?" The system nudges toward the constructive tension pattern without requiring me to remember to ask.</p>

<p>None of these are individually complex, together can catch its own failure modes instead of waiting for me to notice them.</p>

<h2>
  
  
  Where This Lands
</h2>

<p>I started this by naming agents after Pokémon because it was fun, but the metaphor still holds: you don't just catch Pokémon and hope for the best. You train them, give them the right moves, put them in the right matchups, and build a team with complementary strengths and intentional tension. </p>

<p>Stay tuned for the next update! </p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Build your first Power App from data in seconds]]></title>
<description><![CDATA[Author: Microsoft Mechanics - Bewertung: 0x - Views:28 Build a fully working model-driven app from your existing Dataverse, SharePoint, or SQL data in under a minute — screens, navigation, and forms included. Generate new pages from a natural language prompt with Generative Pages, auto-populate r...]]></description>
<link>https://tsecurity.de/de/3681537/youtube-security-videos/build-your-first-power-app-from-data-in-seconds/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3681537/youtube-security-videos/build-your-first-power-app-from-data-in-seconds/</guid>
<pubDate>Mon, 20 Jul 2026 17:15:32 +0200</pubDate>
<content:encoded><![CDATA[<p>Author: Microsoft Mechanics - Bewertung: 0x - Views:28 <br/></p><p><iframe id="ytplayer" loading="lazy" type="text/html" width="100%" height="auto" src="https://www.youtube.com/embed/YH3MLJ6fkNI?autoplay=1&origin=http://tsecurity.de" frameborder="0"></iframe></p><p>Build a fully working model-driven app from your existing Dataverse, SharePoint, or SQL data in under a minute — screens, navigation, and forms included. Generate new pages from a natural language prompt with Generative Pages, auto-populate records from any document in seconds with Automatic Form Fill, and embed Copilot to query your app data directly.<br />
<br />
Layer in an Agent Feed to proactively surface decisions, missing data, and action items, then connect to Outlook and Microsoft 365 through Work IQ to act on your app data without leaving your inbox. <br />
<br />
Jed Brown, Power Platform Group Product Manager, shares how to turn existing business data into a modern, AI-powered app.<br />
<br />
► QUICK LINKS:<br />
00:00 - Create apps using Power Apps<br />
01:07 - Create an app from existing data<br />
02:26 - Copilot + Form Fill Assist<br />
03:46 - AI-generated pages from a prompt<br />
04:53 - Agent feed for proactive intelligence<br />
06:16 - Microsoft 365 integration via Work IQ<br />
06:46 - Wrap up<br />
<br />
► Link References<br />
<br />
Build your first Power App today at https://make.powerapps.com<br />
<br />
► Unfamiliar with Microsoft Mechanics? Microsoft's Official Video Series for IT<br />
- Subscribe https://www.youtube.com/c/MicrosoftMechanicsSeries<br />
- Microsoft Tech Community: https://techcommunity.microsoft.com/t5/microsoft-mechanics-blog/bg-p/MicrosoftMechanicsBlog<br />
- Podcast: https://microsoftmechanics.libsyn.com/podcast<br />
<br />
► Join us on social:<br />
- https://twitter.com/MSFTMechanics<br />
- https://www.linkedin.com/company/microsoft-mechanics/<br />
- https://www.instagram.com/msftmechanics/<br />
- https://www.tiktok.com/@msftmechanics<br />
<br />
#PowerApps #MicrosoftCopilot #PowerPlatform #LowCode<br/></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Chip That Has No ADC but Still Knows When Its Battery Is Low]]></title>
<description><![CDATA[Somewhere out in the field, a tiny battery-powered sensor is quietly dying. No warning light, no alert, nothing. One day it just stops responding, and nobody knows why until someone finally goes and checks it by hand.

How do you stop that from happening? The obvious answer is measure the battery...]]></description>
<link>https://tsecurity.de/de/3681215/sichere-programmierung/the-chip-that-has-no-adc-but-still-knows-when-its-battery-is-low/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3681215/sichere-programmierung/the-chip-that-has-no-adc-but-still-knows-when-its-battery-is-low/</guid>
<pubDate>Mon, 20 Jul 2026 15:14:13 +0200</pubDate>
<content:encoded><![CDATA[<p>Somewhere out in the field, a tiny battery-powered sensor is quietly dying. No warning light, no alert, nothing. One day it just stops responding, and nobody knows why until someone finally goes and checks it by hand.</p>

<p>How do you stop that from happening? The obvious answer is measure the battery voltage. But what if the chip you are using was never given an ADC(Analog to Digital Converter) to measure anything with?</p>

<p>No ADC means no voltage reading, right? Not quite. Nordic's nRF5x family, including the nRF51 and nRF52 series, has a sneaky little piece of analog hardware built right into the silicon that does not care about your missing ADC at all. It is called <strong>POFCON</strong>, the Power Failure Comparator, and it solves the whole problem with almost no power budget.</p>

<p>Here is the story of how it works, and why it beats a traditional voltage divider for this job.</p>

<h3>
  
  
  The Familiar Way: ADC + Voltage Divider
</h3>

<p>This is the setup everyone learns first.</p>

<ul>
<li>Two resistors split the battery voltage down to something the ADC can read</li>
<li>Firmware wakes up, powers on the ADC, takes a sample, powers it back down</li>
<li>The reading gets compared against a lookup table to decide battery health</li>
</ul>

<p>You get a real number - a full discharge curve, a percentage remaining, whatever you want.</p>

<p><strong>The catch:</strong></p>

<ul>
<li>The divider leaks current constantly, unless you add a switch to gate it (more parts, more GPIOs, more headaches)</li>
<li>Every ADC read costs power to spin up the analog block, settle, sample, and shut back down</li>
</ul>

<p>Fine for a device on mains power. Brutal for a coin cell that is supposed to sleep for months.</p>

<h3>
  
  
  The Sneaky Way: POFCON
</h3>

<p><strong>POFCON</strong>, short for Power Failure Comparator, is a small analog comparator circuit built directly into the chip's silicon during manufacturing, sitting inside the power management block. It is real hardware, not a software feature - it is there whether you use it or not.</p>

<p>You configure a voltage threshold, and the comparator watches the supply rail against an internal reference. It flags the result the moment the rail crosses the line.</p>

<p><strong>No sampling, no conversion, no ADC involved.</strong> It just answers one question: are we above the threshold or below it?</p>

<p>A minimal polling setup at the API level (nRF5 SDK) looks like this:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight c"><code><span class="c1">// Configure the comparator threshold and enable it</span>
<span class="n">nrf_power_pofcon_set</span><span class="p">(</span><span class="n">NRF_POWER</span><span class="p">,</span> <span class="nb">true</span><span class="p">,</span> <span class="n">NRF_POWER_POFTHR_V23</span><span class="p">);</span> <span class="c1">// threshold ~2.3V</span>

<span class="c1">// Later, on wake or on a timer, just read the flag</span>
<span class="n">bool</span> <span class="n">battery_low</span> <span class="o">=</span> <span class="n">nrf_power_pofcon_get</span><span class="p">(</span><span class="n">NRF_POWER</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
</code></pre>

</div>


<blockquote>
<p><strong>Using nRF Connect SDK / Zephyr instead of the nRF5 SDK?</strong> The snippet above is a legacy nRF5 SDK register-level call. In NCS, power-fail detection is configured through devicetree/regulator bindings rather than these direct API calls - check the <code>nrfx_power</code> driver docs for the equivalent on your SDK version before copying this in.</p>
</blockquote>

<p><strong>Why this is clever:</strong> it uses zero external components and burns almost no power, compared to a divider that leaks current and an ADC that costs power on every read.</p>

<ul>
<li>No external divider needed - it watches the internal rail directly</li>
<li>No ADC powers up, ever</li>
<li>It exists specifically for chips that skip a full ADC to save die space and cost</li>
</ul>

<p>This is not a one-chip party trick. Plenty of low-cost, low-power parts skip the ADC for the same reason: cheaper silicon and lower standby current. The name changes depending on who made the chip, but the idea stays the same - a low-power comparator watching the supply rail.</p>

<p><strong>A few places you'll run into it:</strong></p>

<ul>
<li>Across the Nordic nRF5x lineup (nRF51, nRF52 series, and some nRF24 parts), it's called POFCON, exactly as covered here</li>
<li>On STM8 and value-line STM32 parts, the equivalent is usually a Brownout Detector (BOD) or Low Voltage Detector (LVD)</li>
<li>On other budget Bluetooth SoCs, including parts from vendors like Nations Technologies and Telink, you'll find similar brownout or low-voltage detection hardware, just under their own naming</li>
</ul>

<p><strong>A quick word of caution before you go looking for one:</strong> not every chip has this.</p>

<ul>
<li>Some very low-cost parts skip both the ADC and any power-fail comparator, brownout detector, or low-voltage detector entirely</li>
<li>Do not assume it's there just because the chip is marketed as low power</li>
<li>Always open the datasheet first, confirm the block actually exists, and check its threshold options before you design your battery monitoring approach around it</li>
</ul>


<div class="crayons-card c-embed">

  <br>
<strong>The Takeaway:</strong> If you just need a "low battery" signal and nothing more, do not reach for an external voltage divider circuit. Check the datasheet for a power-fail comparator, brownout detector, or low voltage detector block first. In Nordic parts that block is POFCON. On other vendors it will have a different name, but it is very likely already sitting there, unused, ready to do this exact job for close to zero extra power.<br>

</div>



<h3>
  
  
  The Real Tradeoff
</h3>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th></th>
<th>ADC + Voltage Divider</th>
<th>POFCON</th>
</tr>
</thead>
<tbody>
<tr>
<td>What you get</td>
<td>Actual voltage value</td>
<td>Above or below threshold, nothing else</td>
</tr>
<tr>
<td>Detail level</td>
<td>Full discharge curve possible</td>
<td>One fixed threshold</td>
</tr>
<tr>
<td>Power cost</td>
<td>Divider leaks current, ADC costs power per read</td>
<td>Barely anything</td>
</tr>
<tr>
<td>Setup effort</td>
<td>Calibration, lookup tables</td>
<td>Set a threshold and move on</td>
</tr>
<tr>
<td>Good for</td>
<td>Battery percentage, health tracking over time</td>
<td>A simple low-battery flag, cheap</td>
</tr>
</tbody>
</table></div>

<p>If you need the full story of your battery's life, use an ADC. If you just need to know when to shout "replace me," POFCON wins on power every single time.</p>

<h3>
  
  
  Wrapping Up
</h3>

<p>Low-power design is always a game of tradeoffs. The instinct is usually to reach for an ADC by default, but hardware like POFCON is a good reminder that less is sometimes more when battery life is on the line.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Der vergessene Fernwartungszugang]]></title>
<description><![CDATA[Wenn ein Security-Vorfall die industrielle Produktion lahmlegt, könnte ein verwaister Zugang für Drittanbieter der Grund sein.Nopphon_1987 | shutterstock.com



Wenn ich in einer historisch gewachsenen Industrieanlage eine Bestandsaufnahme der Fernzugänge durchführe, begegnen mir immer wieder die...]]></description>
<link>https://tsecurity.de/de/3680297/it-security-nachrichten/der-vergessene-fernwartungszugang/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3680297/it-security-nachrichten/der-vergessene-fernwartungszugang/</guid>
<pubDate>Mon, 20 Jul 2026 07:54:15 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>


<div class="extendedBlock-wrapper block-coreImage undefined"><figure class="wp-block-image size-large"><img loading="lazy" src="https://b2b-contenthub.com/wp-content/uploads/2026/07/Nopphon_1987-shutterstock_1721539840_16z9.jpg?quality=50&amp;strip=all&amp;w=1024" alt="OT Security 16z9" class="wp-image-4195048" width="1024" height="576" sizes="auto, (max-width: 1024px) 100vw, 1024px"><figcaption class="wp-element-caption">Wenn ein Security-Vorfall die industrielle Produktion lahmlegt, könnte ein verwaister Zugang für Drittanbieter der Grund sein.</figcaption></figure><p class="imageCredit">Nopphon_1987 | shutterstock.com</p></div>



<p class="wp-block-paragraph">Wenn ich in einer historisch gewachsenen <a href="https://tsecurity.de/weiterlesen/3652156/3680297/der-vergessene-fernwartungszugang/" target="_blank" rel="noopener noreferrer">Industrieanlage</a> eine Bestandsaufnahme der Fernzugänge durchführe, begegnen mir immer wieder dieselben Artefakte:</p>



<ul class="wp-block-list">
<li>der VPN-Tunnel des Maschinenherstellers aus dem Projekt von vor acht Jahren,</li>



<li>der Mobilfunkrouter im Schaltschrank, an dessen Bestellung sich niemand mehr erinnert oder</li>



<li>das Fernwartungs-Tool auf der Engineering-Workstation, dessen Lizenz noch auf einen längst ausgeschiedenen Servicetechniker läuft.</li>
</ul>



<p class="wp-block-paragraph">Bislang habe ich Bestandsaufnahmen dieser Art in der Energiewirtschaft, der Fertigungsbranche und der Pharmaindustrie begleitet – und noch keine erlebt, die keinen vergessenen Zugang zutage gefördert hätte. Diese wurden nicht mit bösen Hintergedanken eingerichtet, sondern lösten einst ein reales Verfügbarkeitsproblem. Heute bieten sie allerdings unbeaufsichtigten Zugang zu Produktionssystemen.</p>



<p class="wp-block-paragraph">In diesem Beitrag vermittle ich warum Zugänge dieser Art trotz aller Warnungen oft „überleben“ – und an welchem Punkt die Infrastrukturbetreiber ansetzen können, um das künftig zu ändern.</p>



<h2 class="wp-block-heading">Darum überleben industrielle Hintertüren</h2>



<p class="wp-block-paragraph">Dass das eben beschriebene Szenario nicht bloß theoretischer Natur ist, lässt sich auch mit harten Zahlen unterfüttern: Laut dem aktuellen SANS-Whitepaper „<a href="https://tsecurity.de/weiterlesen/3652156/3680297/der-vergessene-fernwartungszugang/" target="_blank" rel="noopener noreferrer">State of ICS/OT Security</a>“ (Download gegen Daten) bildeten nicht-autorisierte externe Zugriffe (häufig über Remote-Wartungskanäle für Dienstleister) den Startpunkt für rund <strong>50 Prozent</strong> aller Sicherheitsvorfälle in Industrieumgebungen. Gleichzeitig fördert die Erhebung auch zutage, dass weniger als <strong>15 Prozent</strong> der Infrastrukturbetreiber über robuste Remote-Access-Kontrollen verfügen.</p>



<p class="wp-block-paragraph">Hinzu kommt noch regulatorischer Druck: Seit Anfang Dezember 2025 ist das <a href="https://tsecurity.de/weiterlesen/3652156/3680297/der-vergessene-fernwartungszugang/" target="_blank" rel="noopener noreferrer">NIS-2-Umsetzungsgesetz</a> ohne Übergangsfrist in Kraft. Dieses verpflichtet rund 30.000 <a href="https://tsecurity.de/weiterlesen/3652156/3680297/der-vergessene-fernwartungszugang/" target="_blank" rel="noopener noreferrer">regulierte Organisationen</a> in Deutschland ausdrücklich dazu, ihre Lieferketten abzusichern, Access-Control-Konzepte zu entwickeln und durchzusetzen sowie Multi-Faktor-Authentifizierung zu nutzen. Für die Umsetzung dieser Maßnahmen haftet die Geschäftsleitung persönlich. Ein Fernwartungszugang für Drittanbieter liegt in der Schnittmenge der genannten Pflichten – und ist damit kein Maintenance-Nischenthema mehr, sondern ein Prüfstein für <a href="https://tsecurity.de/weiterlesen/3652156/3680297/der-vergessene-fernwartungszugang/" target="_blank" rel="noopener noreferrer">Compliance</a>.</p>



<p class="wp-block-paragraph">Wenn ich die Verantwortlichen im Unternehmen ganz direkt frage, warum so ein Tunnel für Dienstleister immer noch offen ist, höre ich selten Ausreden. Genannt werden vor allem vier strukturelle Begründungen.  </p>



<ul class="wp-block-list">
<li><strong>Die Gewährleistungskopplung:</strong> Viele Hersteller knüpfen Garantien – etwa bezüglich Reaktionszeiten – daran, dass ihre eigenen Standards für die Fernwartung genutzt werden.</li>



<li><strong>Die Machtasymmetrie:</strong> Ein einzelner Betreiber verhandelt mit einem globalen Maschinenbauer, dessen Servicebedingungen für Hunderte von Kunden identisch sind.</li>



<li><strong>Die Brownfield-Realität:</strong> Die Zugänge sind über Jahre in Einzelprojekten entstanden, die Verantwortung diffundiert zwischen Instandhaltung, IT und Einkauf – niemand fühlt sich zuständig.</li>



<li><strong>Die Verfügbarkeitslogik: </strong>Der offene Tunnel wirkt wie eine Versicherung gegen Stillstand. Das Cyberrisiko ist abstrakt, der Produktionsausfall konkret – und über die Kennzahlen des Werksleiters entscheidet der Ausfall, nicht das Audit.</li>
</ul>



<p class="wp-block-paragraph">Ein Absicherungskonzept, das diese Kräfte ignoriert, bleibt Papier. Deshalb ordne ich die Maßnahmen in meinen Projekten bewusst so an: Transparenz zuerst, dann Vertrag, Technik und schließlich Betrieb.</p>



<h2 class="wp-block-heading">Industrielle Access-Hygiene in der Praxis</h2>



<p class="wp-block-paragraph">Dabei beginne ich mit einer Liste, die darüber Auskunft gibt, wer aktuell aus welchem Grund Zugriff über welchen Kanal hat und seit wann. Die Quellen sind dabei unspektakulär: Firewall-Regelwerke, VPN-Konten, externe Accounts im Verzeichnisdienst, Mobilfunkverbindungen in Schaltschränken, installierte Fernwartungs-Tools. Ergänzend kommen Gespräche mit der Instandhaltung dazu, denn ein erheblicher Teil der Zugänge existiert nur in Köpfen, nicht in Dokumenten. Im Ergebnis steht ein Zugangsregister mit Eigentümer, Zweck, Zugriffspfad und Befristung. Accounts für die sich kein interner Eigentümer findet, werden nach Ablauf einer definierten Einspruchsfrist abgeschaltet. Das betrifft im Regelfall einen zweistelligen Prozentsatz der bestehenden Zugänge. In diesen Fällen „kostet“ es also lediglich eine Abstimmungsrunde, um die <a href="https://tsecurity.de/weiterlesen/3652156/3680297/der-vergessene-fernwartungszugang/" target="_blank" rel="noopener noreferrer">Risiken zu reduzieren</a>.</p>



<p class="wp-block-paragraph">Für das was übrig bleibt, gilt der Grundsatz Anforderungen vor Zugang. Bevor ein solcher eingerichtet wird, müssen Leistungsumfang und Vertraulichkeit geregelt werden. Bei missionskritischen Zulieferern oder Dienstleistern sollten zudem zusätzlich Security-Anforderungen auch vertraglich festgelegt werden. Zwei Details machen dabei den Unterschied zwischen belastbaren und symbolischen Verträgen:</p>



<ul class="wp-block-list">
<li>eine <strong>Vererbungspflicht</strong>, die dem Lieferanten auferlegt, dieselben Sicherheitskontrollen an seine Subunternehmer weiterzureichen, bevor diese Zugriff erhalten, und</li>



<li>ein <strong>definierter Ersatz für verweigerte Auditrechte</strong>, etwa unabhängige Prüfberichte, die der Dienstleister jährlich vorlegt. Statt eigene Kataloge zu erfinden, referenziere ich die IEC 62443-2-4, die genau diese Anforderungen an Service-Provider normiert.</li>
</ul>



<p class="wp-block-paragraph">Bei Richtlinienprüfungen werfe ich zuerst einen Blick auf ein unscheinbares Detail: das Modalverb. Denn in den Regelwerken, die ich in den vergangenen Jahren für Energie-, Industrie- und Pharmaunternehmen geprüft oder mitgeschrieben habe, definiert die Unterscheidung zwischen „muss“ und „sollte“, wie die Realität aussieht: Ist die Befristung externer Konten als Muss-Regel mit automatischem Ablauf formuliert, verfallen die Konten tatsächlich. Wird dieselbe Anforderung als Empfehlung mit Jahresfrist festgehalten, finden sich beim nächsten <a href="https://tsecurity.de/weiterlesen/3652156/3680297/der-vergessene-fernwartungszugang/" target="_blank" rel="noopener noreferrer">Audit</a> dieselben Karteileichen wie bei dem zuvor. Oder anders formuliert: Im ersten Fall wirkt das Regelwerk, im zweiten ist es lediglich Dekoration.</p>



<p class="wp-block-paragraph">An dieser Stelle begegnet mir immer wieder das hartnäckige Gegenargument, dass ohne den Standard-Remote-Zugang die Gewährleistung erlischt. Dieses Problem lässt sich in meiner Erfahrung auf drei verschiedene Weisen lösen:</p>



<ul class="wp-block-list">
<li><strong>Verhandlungsfenster nutzen:</strong> Neubeschaffung, Retrofit und die Verlängerung von Serviceverträgen sind die Momente, in denen sich Anforderungen durchsetzen lassen.</li>



<li><strong>Rechtslage neu bewerten:</strong> Der Betreiber ist gesetzlich dazu verpflichtet, seine Lieferkette abzusichern. Ein Standardzugang, der dem entgegensteht, stellt insofern ein rechtliches Risiko dar – zunehmend auch für den Hersteller, der als Teil der Lieferkette in den Pflichtenkreis seiner Kunden rückt.</li>



<li><strong>Kompensieren, wo sich nichts durchsetzen lässt:</strong> Ein Fernwartungszugang ließe sich beispielsweise auf ein betreibereigenes Gateway beschränken, das standardmäßig von den Produktionssystemen getrennt ist und gesondert überwacht wird. Entscheidend ist an dieser Stelle, dass eine Risikoentscheidung getroffen und dokumentiert wird – statt den Status Quo weiter still zu dulden.</li>
</ul>



<p class="wp-block-paragraph">Technisch folgt der Rest dem Single-Channel-Prinzip: Alle externen Zugriffe laufen über eine dedizierte Fernwartungs-DMZ und gehärtete Sprungserver. Direkte RDP-, SSH- oder VNC-Logins in OT-Systeme sind ebenso tabu wie herstellereigene Parallelwege über Cloud-Portale oder mitgebrachte Mobilfunkrouter. <a href="https://tsecurity.de/weiterlesen/3652156/3680297/der-vergessene-fernwartungszugang/" target="_blank" rel="noopener noreferrer">Multi-Faktor-Authentifizierung</a> ist gesetzt. Derselbe Grundsatz gilt für On-Premises-Zugänge: Dienstleister-Devices, -Modems, und -Smartphones müssen draußen bleiben, USB-Ports sind standardmäßig deaktiviert. In OT-Umgebungen sollten ausschließlich dedizierte, betreibereigene Engineering-Devices zum Einsatz kommen.</p>



<p class="wp-block-paragraph">Sammelkonten wie „Service“ oder „Wartung“ ersetze ich dabei durch personalisierte Kennungen im Verzeichnisdienst des Betreibers – nur so entstehen Zurechenbarkeit und die Möglichkeit für ein sauberes Offboarding. Reife heißt dabei nicht null Ausnahmen, sondern Ausnahmen mit Preisschild: Wo ein Altsystem technisch keine individuellen Konten unterstützt, sollten gute Regelwerke ein lückenloses Zugriffsprotokoll generieren, das jede einzelne Anmeldung einer physischen Person zuordnet und eine Genehmigung durch das Security-Team erfordert. Der Default-Zustand ist dann bei jedem Zugang grundsätzlich „deaktiviert“. Aktiviert wird er je nach Einsatzzweck durch den Asset Owner – inklusive definiertem Zeitfenster für den Zugang, das an die Vertragslaufzeit gekoppelt ist. </p>



<p class="wp-block-paragraph">Die konsequentesten Umsetzungen, die mir begegnet sind, gehen noch einen Schritt weiter: Externe Konten verfallen dort automatisch nach sechs Monaten und brauchen eine aktive Neugenehmigung. Privilegierte Zugänge werden zusätzlich halbjährlich rezertifiziert – in Hochrisikozonen durch eine unabhängige Stelle. Und: Nach 90 Tagen Inaktivität wird jeder Account automatisch gelöscht. Das sorgt für eine „Beweislastumkehr“: Nicht die Sperrung eines Kontos muss dann begründet werden, sondern dessen Fortbestand.</p>



<p class="wp-block-paragraph">Auch an dieser Stelle begegnen mir regelmäßig zweierlei Einwände:</p>



<ol class="wp-block-list">
<li><strong>„Was passiert bei der Störung am Samstagabend, wenn kein Asset Owner erreichbar ist?“</strong> – die Antwort ist ein Break-Glass-Prozess – eine vordefinierte Notfallfreigabe durch die Leitwarte oder Rufbereitschaft, eng befristet, mit automatischer Alarmierung, verpflichtender Sitzungsaufzeichnung und nachträglicher Genehmigung binnen 24 Stunden. Eine besonders elegante Lösung: Regelwerke, die Notfallrechte temporär der persönlichen Kennung des Technikers zuweisen statt einem anonymen Notfallkonto – die Zurechenbarkeit bleibt erhalten – und wo dedizierte Notfallkonten unvermeidbar sind, liegen sie in einem Passwort-Tresor, dessen Öffnung selbst wieder Authentifizierung und Protokoll erzwingt. Ohne diesen Prozess scheitert jedes Just-in-Time-Modell an der ersten Nachtschicht, die es umgeht.</li>



<li><strong>„Unsere Altsysteme können kein MFA.“</strong> – das müssen sie auch nicht, die Kontrolle wandert an den Rand. Identitätsprüfung und MFA werden am Sprungserver erzwungen, das Altsystem sieht nur dessen Sitzung. Die Systempasswörter liegen im Kennwort-Tresor eines Privileged-Access-Management-Systems und werden dem Techniker nie angezeigt, sondern automatisch in die Sitzung injiziert. Das entschärft nebenbei das Problem, dass Gerätepasswörter den Dienstleister überleben, wenn dessen Techniker wechseln.</li>
</ol>



<p class="wp-block-paragraph">Bleibt die Beweisfähigkeit: Wer wann über welchen Weg auf welches System zugegriffen hat, muss über die Systeme des Betreibers nachweisbar sein – im eigenen <a href="https://tsecurity.de/weiterlesen/3652156/3680297/der-vergessene-fernwartungszugang/" target="_blank" rel="noopener noreferrer">SIEM</a>, nicht in den Protokollen des Dienstleisters. Und Protokollierung meint dabei mehr, als lediglich An- und Abmeldungen zu erfassen: Erst wenn Befehle, Dateizugriffe und Parameteränderungen innerhalb der Sitzung erfasst werden, weiß man mehr, als dass „sich jemand eingeloggt“ hat. Die konsequentesten Regelwerke machen Admin-Protokolle für den Administrator selbst unveränderbar und überwachen das PAM-System seinerseits per SIEM – da ansonsten niemand mehr das Tool kontrolliert, das alles andere kontrolliert.</p>



<p class="wp-block-paragraph">Kommt es zu einem Sicherheitsvorfall, müssen Betreiber, die auf Logs der Gegenseite angewiesen sind, aus der Defensive heraus verhandeln. Angesichts der persönlichen Haftung des Managements ist das kein forensisches Detail, sondern Selbstschutz. Am (Vertrags-)Ende steht dann schließlich noch der richtige Rückbau: Konten müssen deaktiviert, temporäre Firewall-Regeln entfernt sowie Token und Zertifikate deprovisioniert werden – gekoppelt an den Lieferantenstatus im Einkaufssystem, nicht an eine manuelle E-Mail. Der häufigste Befund in Access-Audits sind aktive Konten aus längst beendeten Verträgen.</p>



<h2 class="wp-block-heading">OT-Risiken reduzieren mit dem 4-Stufen-Ansatz</h2>



<p class="wp-block-paragraph">Fünfzehn Maßnahmen parallel zu fahren, dürfte nahezu jede Organisation überfordern. Ich priorisiere die Risikoreduktion nach Aufwand in vier Stufen:</p>



<ul class="wp-block-list">
<li><strong>Stufe 1</strong> sieht die Inventur und die Abschaltung von Zugängen ohne Eigentümer vor. Das gewährleistet eine hohe Wirkung bei gleichzeitig geringem Aufwand – auch zeitlich, denn das ist in Wochen umsetzbar.</li>



<li><strong>Stufe 2</strong> verlangt einen zentralen Zugriffskanal mit DMZ, Sprungservern und ausnahmsloser MFA vor. Auch hier steht im Ergebnis eine hohe Wirkung – bei mittlerem Aufwand. Die Umsetzungszeit liegt im Bereich von Monaten.</li>



<li><strong>Stufe 3</strong> setzt einen Just-in-Time-Freigabeprozess mit Befristung und Break-Glass-Verfahren voraus. Hier ist der Aufwand vor allem organisatorischer Natur.</li>



<li><strong>Stufe 4</strong> erfordert ein PAM mit Kennwort-Tresor, Sitzungsaufzeichnung und SIEM-Anbindung. Das gewährleistet Nachweisbarkeit und Auditreife. Wie groß der Abstand zwischen Anspruch und Realität gerade hier ist, verdeutlicht ebenfalls ein Blick in die vorgenannte SANS-Erhebung: Demnach haben nur circa <strong>13 Prozent</strong> der Infrastruktubetreiber Session-Aufzeichnungen und Echtzeit-Freigaben vollständig implementiert.</li>
</ul>



<p class="wp-block-paragraph">Mein Fazit nach diversen Projekten dieser Art: Ein Dienstleisterzugang stellt keinen Zustand dar, sondern braucht einen Lebenszyklus – er muss beantragt, befristet, überwacht und zurückgebaut werden. Die Technik dafür ist seit Jahren verfügbar. Wer heute mit der Access-Inventur beginnt und den zentralen Kanal konsequent durchsetzt, kann bereits mit der Umsetzung von Stufe 1 und 2 einen Großteil der Risiken reduzieren – und parallel Compliance sicherstellen.</p>



<p class="wp-block-paragraph">Wie sich diese Bausteine zu einem vollständigen <a href="https://tsecurity.de/weiterlesen/3652156/3680297/der-vergessene-fernwartungszugang/" target="_blank" rel="noopener noreferrer">ISMS</a> für die Industrie zusammenfügen lassen, lesen Sie in ausführlicher Form in meinem Praxisratgeber, der im September bei Springer Vieweg erscheint. (fm)</p>



<p class="wp-block-paragraph"><strong>Dieser Beitrag wurde im Rahmen des deutschsprachigen Experten-Netzwerks von Foundry veröffentlicht. Lust mitzumachen? </strong><a href="https://tsecurity.de/weiterlesen/3652156/3680297/der-vergessene-fernwartungszugang/" target="_blank" rel="noopener noreferrer"><strong>Jetzt bewerben</strong></a><strong>!</strong></p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Focus Sessions That Stick: The Complete 25-Minute Protocol]]></title>
<description><![CDATA[What Is a Focus Session?


A focus session is a bounded block of time — typically 20 to 50 minutes — dedicated to a single, clearly defined task with all distractions removed. Unlike a general 'work block', a focus session has three hard requirements: a specific intention set before the timer sta...]]></description>
<link>https://tsecurity.de/de/3679898/sichere-programmierung/focus-sessions-that-stick-the-complete-25-minute-protocol/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3679898/sichere-programmierung/focus-sessions-that-stick-the-complete-25-minute-protocol/</guid>
<pubDate>Sun, 19 Jul 2026 21:41:06 +0200</pubDate>
<content:encoded><![CDATA[<h2>
  
  
  What Is a Focus Session?
</h2>

<p>A focus session is a bounded block of time — typically 20 to 50 minutes — dedicated to a single, clearly defined task with all distractions removed. Unlike a general 'work block', a focus session has three hard requirements: a specific intention set before the timer starts, uninterrupted execution during the block, and a brief review at the end. This structure is what separates a focus session from just sitting at your desk hoping something happens.</p>

<p>The mechanism that makes focus sessions powerful is simple: they convert abstract goals into concrete, completable units. Your brain handles bounded tasks fundamentally differently than open-ended ones. A timer creates a finish line, which activates a different motivational circuit than vague intentions like 'work on the report'. This is why even people who struggle with sustained attention often find focus sessions surprisingly manageable.</p>

<h2>
  
  
  The Problem With Vague Work Blocks
</h2>

<p>Most productivity advice tells you to 'schedule deep work' without explaining what that means in practice. People block out two hours, sit down, and immediately face a different problem: what exactly am I supposed to do right now? The absence of a clear, single intention triggers task-switching — jumping between tasks, checking email, or procrastinating — because the brain defaults to easier, more defined activities when the primary task feels fuzzy.</p>

<p>Research on attention residue shows that every task you partially engage with leaves a cognitive trace that degrades performance on your next task for up to 20 minutes. Vague work blocks create dozens of micro-switches throughout a session, meaning you're working at a fraction of your capacity for most of the time you're supposedly 'in focus mode'. A clearly named intention eliminates this entirely.</p>

<h2>
  
  
  The Science Behind the 25-Minute Window
</h2>

<p>The 25-minute duration is not arbitrary. It sits within the range of most individuals' natural attention span before cognitive fatigue begins to noticeably degrade output quality. Ultradian rhythm research suggests the brain operates in roughly 90-minute cycles of peak and trough alertness — and within those cycles, 20-30 minute active work periods are the most productive when paired with genuine rest periods between them.</p>

<p>Practically, 25 minutes is short enough to start without dread and long enough to generate meaningful progress. The psychological barrier to beginning a '3-hour deep work block' is enormous; the barrier to starting a '25-minute session' is almost zero. This matters enormously for building a consistent habit, especially in the first 30 days when the routine isn't automatic yet.</p>

<h2>
  
  
  The 25-Minute Focus Protocol, Step by Step
</h2>

<ol>
<li>
<strong>Set a single, specific intention</strong> — Write one sentence in the format: 'By the end of this session, I will have [specific output].' Bad: 'Work on the project.' Good: 'Write the first draft of the methodology section.' Your intention should be completable within 25 minutes or clearly scoped to a first phase.</li>
<li>
<strong>Close everything except what you need</strong> — Close every browser tab, app, and notification source that is not directly required for this session. Put your phone in another room or face-down on silent. This takes 60 seconds and doubles your effective output. Environmental design beats willpower every time.</li>
<li>
<strong>Start the timer and start the work simultaneously</strong> — No warming up, no checking one last thing. The moment you press start, you begin work. The habit loop is: timer starts → you work. Any delay breaks the association and invites procrastination.</li>
<li>
<strong>Work on only that task until the timer ends</strong> — If a new thought arises — an email you need to send, an idea for a different project — write it in a capture list beside you and return immediately to the session task. Do not follow the thought. Capture it so you can trust it won't be lost, then refocus.</li>
<li>
<strong>End with a 3-minute review</strong> — When the timer ends, spend exactly 3 minutes answering: What did I complete? What blocked me? What is the very next action for this task? This review is the step that converts a one-off effort into a habit and ensures you can pick up the work without re-orienting next session.</li>
<li>
<strong>Take a real break before the next session</strong> — 5 to 10 minutes away from screens, ideally involving movement. A real break — not scrolling — restores attentional resources. Stacking sessions without genuine breaks produces diminishing returns fast.</li>
</ol>

<h2>
  
  
  How to Choose an Intention That Actually Works
</h2>

<p>The quality of your intention determines the quality of your session. A good intention is specific about output, not activity. 'Work on the slide deck' is an activity. 'Complete the three data slides in section two of the pitch deck' is an output. Output-based intentions give you a clear completion signal, which is crucial for motivation and for the end-of-session review.</p>

<ul>
<li>Too vague: 'Review the codebase' → Specific: 'Trace and document the authentication flow in auth/session.ts'</li>
<li>Too vague: 'Write the report' → Specific: 'Draft the executive summary — 200 words, three key findings'</li>
<li>Too vague: 'Research competitors' → Specific: 'Fill in the pricing column for all 5 competitors in the comparison doc'</li>
<li>Too vague: 'Think about the design' → Specific: 'Sketch three layout options for the mobile onboarding screen'</li>
<li>Too broad: 'Build the feature' → Specific: 'Implement the form validation logic for the signup flow'</li>
</ul>

<h2>
  
  
  Eliminating Distractions Before You Start
</h2>

<p>The most common reason focus sessions fail is not lack of willpower — it is an environment that wasn't prepared before the timer started. Every notification, open tab, and ambient noise is a potential interruption that costs you 23 minutes of recovery time, according to UC Irvine research on task resumption. The distraction setup is not an optional nice-to-have. It is the session.</p>

<ul>
<li>Notifications: enable Do Not Disturb on all devices before touching the timer</li>
<li>Phone: place it in another room or inside a drawer — out of sight reduces temptation by 70%</li>
<li>Browser tabs: close everything except the one resource you need; use a tab manager if needed</li>
<li>Messaging apps: set a Slack/Teams status indicating you're in a focus block — most teams respect this</li>
<li>Background noise: use brown noise, lo-fi music without lyrics, or silence — avoid anything with speech</li>
<li>Physical environment: clear your desk surface; visual clutter activates background processing</li>
<li>People: if you work in a shared space, headphones signal focus — have a hand signal for 'not now'</li>
</ul>

<h2>
  
  
  The End-of-Session Review: The Step That Makes the Habit Stick
</h2>

<p>The end-of-session review is the most skipped and most important step in the protocol. When you skip it, sessions feel incomplete, the habit doesn't consolidate, and you lose context that would save you 10 minutes next time you return to the task. When you do it consistently, it creates a feedback loop: you can see your own progress across sessions, and that visible progress becomes the motivation to start the next one.</p>

<ul>
<li>What did I complete in this session? (even partial progress counts — name it specifically)</li>
<li>What blocked me, if anything? (note it so you can remove it before next time)</li>
<li>What is the single next action for this task? (write it in one sentence — this is your next session's intention)</li>
<li>How was my focus quality? (1–5 scale — tracking this reveals your best focus times of day)</li>
</ul>

<blockquote>
<p><strong>Key insight:</strong> The review doesn't need to be written in full sentences. Four bullet points in 3 minutes is all you need. The discipline is doing it every time, not doing it perfectly.</p>
</blockquote>

<h2>
  
  
  How Many Focus Sessions to Run Per Day
</h2>

<p>Three to six sessions per day is the range for most knowledge workers, depending on role, meeting load, and the cognitive intensity of the work. Creative and strategic work depletes attentional resources faster than execution tasks, meaning a writer might max out at four quality sessions while a developer doing straightforward implementation might run six. The number matters less than the quality — four excellent sessions beat eight mediocre ones.</p>

<p><em>Recommended daily focus sessions by work type</em></p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Work Type</th>
<th>Sessions / Day</th>
<th>Best Session Length</th>
<th>Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td>Deep creative (writing, design)</td>
<td>3–4</td>
<td>25–35 min</td>
<td>Highest depletion rate; prioritize morning</td>
</tr>
<tr>
<td>Strategic thinking / planning</td>
<td>3–5</td>
<td>25–40 min</td>
<td>Schedule before meetings when possible</td>
</tr>
<tr>
<td>Software development</td>
<td>4–6</td>
<td>25–50 min</td>
<td>Longer sessions OK for implementation tasks</td>
</tr>
<tr>
<td>Research / analysis</td>
<td>4–5</td>
<td>25–40 min</td>
<td>Note-capture between sessions is critical</td>
</tr>
<tr>
<td>Admin / operations</td>
<td>5–7</td>
<td>20–30 min</td>
<td>Lower depletion; can stack more sessions</td>
</tr>
</tbody>
</table></div>

<h2>
  
  
  Common Focus Session Mistakes
</h2>

<ul>
<li>Setting the intention too late — decide what you're working on before you sit down, not after you open the timer</li>
<li>Using the session for multiple tasks — one task per session is non-negotiable; splits attention like a vague intention</li>
<li>Skipping breaks between sessions — back-to-back sessions without recovery produce flat output by session three</li>
<li>Making sessions too long — 90-minute 'focus sessions' aren't focus sessions; they're vague work blocks with a timer</li>
<li>Treating a distraction as a failed session — capture the distraction, return to work; the recovery is the skill</li>
<li>Not capturing the review — without the review, sessions don't compound into habits or visible progress</li>
<li>Waiting to feel motivated — motivation follows action, not the other way around; start the timer and the work first</li>
</ul>

<h2>
  
  
  Frequently Asked Questions
</h2>

<h3>
  
  
  How is a focus session different from the Pomodoro Technique?
</h3>

<p>The Pomodoro Technique uses fixed 25-minute blocks with strict 5-minute breaks in a repeating cycle. A focus session is more flexible — the length can vary between 20 and 50 minutes based on the task and your cognitive state, and the review component is more structured. The core principle — bounded time on a single task — is the same. Think of focus sessions as a refined, more adaptive version of Pomodoro.</p>

<h3>
  
  
  What if I finish the task before the 25 minutes are up?
</h3>

<p>Do the end-of-session review early and either start the next small task from your list, or end the session and take your break. Never pad a completed task to fill the time — that turns a success into busy work. The timer is a container, not a minimum requirement.</p>

<h3>
  
  
  Can I use focus sessions for meetings or collaborative work?
</h3>

<p>Focus sessions are designed for solo, deep-concentration tasks. Meetings and collaborative work have their own dynamics. However, you can use a focus session before a meeting to prepare materials, and after a meeting to capture action items and decisions while they're fresh — these are high-leverage uses of a 25-minute block.</p>

<h3>
  
  
  What's the best time of day for focus sessions?
</h3>

<p>For most people, the two to four hours after waking — before email, meetings, and reactive tasks — is peak cognitive performance time. Schedule your two most important focus sessions during this window. If you're an evening person, your peak may shift by 4–6 hours, but the principle holds: guard your peak hours for your highest-value sessions.</p>

<h3>
  
  
  How do I build the focus session habit if I keep forgetting to start?
</h3>

<p>Anchor the habit to an existing trigger. 'After I make my morning coffee, I start my first focus session' is more reliable than 'I'll do focus sessions in the morning.' Use a consistent starting ritual — same location, same noise environment, same 60-second distraction-clearing routine — and the habit will become automatic within 30–60 days of consistent practice.</p>




<p><em>Originally published on <a href="https://tsecurity.de/weiterlesen/3651757/3679898/focus-sessions-that-stick-the-complete-25-minute-protocol/" target="_blank" rel="noopener noreferrer">Xenith</a>.</em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[I Built an AI App. Eight Months Later, It Became a Skill]]></title>
<description><![CDATA[When I first wrote about NutriAgent in November 2025, it was a full application. It had a Python backend, a web interface, a Telegram bot, user accounts, Google OAuth, Supabase, and a Google Sheets integration.

Recently, I reproduced its core workflow as a skill for my personal AI agent. It took...]]></description>
<link>https://tsecurity.de/de/3679021/sichere-programmierung/i-built-an-ai-app-eight-months-later-it-became-a-skill/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3679021/sichere-programmierung/i-built-an-ai-app-eight-months-later-it-became-a-skill/</guid>
<pubDate>Sun, 19 Jul 2026 08:54:49 +0200</pubDate>
<content:encoded><![CDATA[<p>When I first wrote about NutriAgent in November 2025, it was a full application. It had a Python backend, a web interface, a Telegram bot, user accounts, Google OAuth, Supabase, and a Google Sheets integration.</p>

<p>Recently, I reproduced its core workflow as a skill for my personal AI agent. It took around 15 minutes and two prompts. I didn't build another backend, deploy a service, or implement OAuth again. I explained how I wanted the workflow to behave, tested it, and watched a new row appear in my nutrition spreadsheet.</p>

<p>The original application wasn't a mistake. It was how I could deliver that experience with the tools available at the time.</p>

<p>Eight months later, the starting point had changed.</p>

<h2>
  
  
  Eight Months Ago, This Was an App
</h2>

<p>I built NutriAgent because I wanted to track calories and protein without trapping my data inside a nutrition app. I wanted the raw records in a spreadsheet I controlled, where I could create my own reports and eventually connect nutrition with my training data.</p>

<p>The first version was a personal n8n workflow. It worked for me, but when a friend wanted to try it, I realized that everything was tied to my accounts. To make it reusable, I rebuilt it in Python and added the parts a real multi-user product needed: authentication, storage, a web interface, Telegram, Google OAuth, conversation history, and account linking.</p>

<p>I've already told that story in <a href="https://tsecurity.de/weiterlesen/3650880/3679021/i-built-an-ai-app-eight-months-later-it-became-a-skill/" target="_blank" rel="noopener noreferrer">I Ditched MyFitnessPal and Built an AI Agent to Track My Food</a>, and later wrote about what broke after <a href="https://tsecurity.de/weiterlesen/3650880/3679021/i-built-an-ai-app-eight-months-later-it-became-a-skill/" target="_blank" rel="noopener noreferrer">I used it every day for a month</a>.</p>

<p>This article starts after that version.</p>

<h2>
  
  
  My Gaming PC Became an Agent Box
</h2>

<p>I had a modest gaming PC at home with 16 GB of RAM and a 1 TB drive. Using it through Windows, WSL, and remote desktop from my Mac felt awkward, so I installed Linux and turned it into a remote box for running agents. I'll write about that setup separately.</p>

<p>I moved Hermes there from a VPS. Hermes is the personal agent I now run on that machine. It can load reusable skills and use tools connected to my Google Workspace. The PC runs the agent environment, not the frontier model itself.</p>

<p>Once Hermes was running, I wanted to test a workflow I already understood well. NutriAgent was the obvious candidate.</p>

<h2>
  
  
  Two Prompts, Fifteen Minutes
</h2>

<p>Instead of opening the old repositories, I described the outcome I wanted. Hermes should understand a meal, estimate its nutritional values, follow the structure of my existing log, and append the result to Google Sheets.</p>

<p>The first prompt created the initial skill. I used a second prompt to clarify the remaining details and adjust how it should write the data.</p>

<p>Then I tried it with an actual meal.</p>

<p>The result landed in the same kind of spreadsheet I originally built NutriAgent to produce. There wasn't a new service running behind it. Hermes already knew how to interpret natural language and use tools. Google Sheets already held the data. The skill supplied the part that was specific to me: the procedure.</p>

<p>That's the part that surprised me. I didn't find a cleverer way to rebuild NutriAgent. I didn't rebuild it at all.</p>

<h2>
  
  
  What I No Longer Had to Build
</h2>

<p>The skill isn't equivalent to the full NutriAgent product. I can't give someone a signup link. It doesn't have a generic Telegram bot, its own Google OAuth flow, or a dedicated interface. It only needs to work with my agent, my Google account, and my spreadsheet.</p>

<p>For personal use, that was enough to preserve the behavior I cared about:</p>

<ul>
<li>Understand what I ate.</li>
<li>Estimate calories and macros.</li>
<li>Follow the schema of my nutrition log.</li>
<li>Save the result somewhere I control.</li>
</ul>

<p>Previously, I had to own both that behavior and the application around it. Now Hermes provides much of the environment, and the skill only describes what is different about this workflow.</p>

<p>This also changed the marginal cost. I moved Hermes off the VPS and configured this experiment to use model access I already had through my Codex subscription instead of maintaining a separate per-call API bill for NutriAgent. The subscription and the electricity aren't free, so this isn't a zero-cost workflow. But it removed a separate bill for each NutriAgent interaction.</p>

<p>The skill also changed how I add features. I had wanted predefined meals for food I had already analyzed on previous days. In NutriAgent, that would've meant changing the application, updating the prompt, testing the new behavior, and deploying another version.<br>
With Hermes, I just said, “Remember this meal data for next time under this name.” That was enough to make it part of the workflow. A feature I had postponed in the application became a one-request change.<br>
For a personal workflow, I wasn't only skipping the initial development. I was also skipping much of the release cycle for every small improvement after it.</p>

<h2>
  
  
  I Started Seeing the Same Question Elsewhere
</h2>

<p>I recently watched Theo Browne's talk <a href="https://tsecurity.de/weiterlesen/3650880/3679021/i-built-an-ai-app-eight-months-later-it-became-a-skill/" target="_blank" rel="noopener noreferrer">Everything We Knew About Software Has Changed</a>. His broader point was that capable models with tools such as code execution can reduce some ideas that once required custom software to a set of structured instructions. At one point, he joked that many startups in the room could be Markdown files.</p>

<p>That sounded less abstract after the NutriAgent experiment.</p>

<p>I also read <a href="https://tsecurity.de/weiterlesen/3650880/3679021/i-built-an-ai-app-eight-months-later-it-became-a-skill/" target="_blank" rel="noopener noreferrer">@javz</a> <a href="https://tsecurity.de/weiterlesen/3650880/3679021/i-built-an-ai-app-eight-months-later-it-became-a-skill/" target="_blank" rel="noopener noreferrer">Start Building for Agents, Not Just Humans</a>. In <a href="https://tsecurity.de/weiterlesen/3650880/3679021/i-built-an-ai-app-eight-months-later-it-became-a-skill/" target="_blank" rel="noopener noreferrer">my comment</a>, I connected his argument to personal agents that increasingly handle the interaction for us. If I already start from Hermes, a smaller application may not need to own the entire experience. It may only need to give my agent the missing behavior.</p>

<p>I don't think this means every AI product will become a Markdown file. NutriAgent is a personal workflow that writes to a destination I control. Products serving many people still have responsibilities around reliability, permissions, privacy, onboarding, support, and shared state. Some products are valuable precisely because they coordinate people or centralize something that an agent can't create on demand.</p>

<p>I don't have a clean answer for where that line is. But I know my first step has changed. A few months ago, I would've started a workflow like this by creating a repository. Today, I'd try it as a skill first and build the standalone product only when the workflow proves it needs one.</p>

<h2>
  
  
  Now I Have to Ask This About Synapse
</h2>

<p>NutriAgent isn't the only AI product I've built.</p>

<p>Synapse, <a href="https://tsecurity.de/weiterlesen/3650880/3679021/i-built-an-ai-app-eight-months-later-it-became-a-skill/" target="_blank" rel="noopener noreferrer">the personal AI companion I built for my wife</a>, has a much more complex memory system. It ingests conversations, extracts entities and relationships, stores them in a temporal knowledge graph, and retrieves relevant context for future conversations. I've spent months improving its ingestion, GraphRAG retrieval, context budgets, and memory interfaces, It now serves more people, so multi-tenant is a thing.</p>

<p>Now I'm wondering how much of that system I would build if I started again today.</p>

<p>Could the ingestion workflow become a skill? Could a general-purpose agent use a graph tool and follow instructions for consolidating conversations? Is the graph architecture the product, or is it one implementation of the outcome I want?</p>

<p>I don't know.</p>

<p>Synapse may still need a dedicated product because reliable long-term memory, privacy, evaluation, and the experience around personal conversations could be the actual value. Or I may find that some of the system can be compressed just as NutriAgent was.</p>

<p>Most of my articles are about building more software to solve a problem. This one is about removing software while keeping the core workflow alive.</p>

<p>NutriAgent made sense as an application when I built it. What interests me now isn't whether that decision was correct. It's what kinds of products will still need to exist when personal agents can assemble workflows like this on demand.</p>

<p>Before I build my next AI product, I want to know how much of it can be a skill first.</p>

<p>If you are building AI products and want to follow along, I write about the problems and trade-offs that appear when someone actually uses them.</p>

<p>Follow me:</p>

<ul>
<li>X: <a href="https://tsecurity.de/weiterlesen/3650880/3679021/i-built-an-ai-app-eight-months-later-it-became-a-skill/" target="_blank" rel="noopener noreferrer">@juandastic</a>
</li>
<li>LinkedIn: <a href="https://tsecurity.de/weiterlesen/3650880/3679021/i-built-an-ai-app-eight-months-later-it-became-a-skill/" target="_blank" rel="noopener noreferrer">Juan David Gomez</a>
</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Why Records Are the Better Choice for Clean, Modern, and Principle-Driven .NET Development]]></title>
<description><![CDATA[If you've been writing C# for more than a few years, you've written thousands of DTOs. Request models, response models, event payloads, integration contracts — the connective tissue of every distributed system. And if you're like most of us, you've written nearly all of them as classes with { get...]]></description>
<link>https://tsecurity.de/de/3677861/sichere-programmierung/why-records-are-the-better-choice-for-clean-modern-and-principle-driven-net-development/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3677861/sichere-programmierung/why-records-are-the-better-choice-for-clean-modern-and-principle-driven-net-development/</guid>
<pubDate>Sat, 18 Jul 2026 12:54:13 +0200</pubDate>
<content:encoded><![CDATA[<p>If you've been writing C# for more than a few years, you've written thousands of DTOs. Request models, response models, event payloads, integration contracts — the connective tissue of every distributed system. And if you're like most of us, you've written nearly all of them as classes with <code>{ get; set; }</code> properties, because that's what we've done since .NET Framework 2.0.</p>

<p>Here's the uncomfortable truth: <strong>a mutable class is the wrong data structure for a DTO</strong>, and it has been since C# 9 gave us a better one. Not "stylistically wrong." Wrong in ways that show up as production incidents — duplicate payments, corrupted audit trails, and race conditions in async pipelines.</p>

<p>This article makes the case from first principles, with examples drawn from banking and fintech systems — payment processing, reconciliation, maker-checker workflows — because that's where the cost of getting this wrong is measured in money, not just bugs. Whether you're a junior engineer writing your first API contract or a solutions architect reviewing a payment platform design, the goal is the same: understand <em>why</em> records exist, not just <em>how</em> to type them.</p>




<h2>
  
  
  🚚 What Are DTOs in Practice?
</h2>

<p>Imagine you're building a ride-sharing app like Uber or Bolt. When the frontend requests a list of nearby drivers, you return a <code>DriverDto</code>:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight json"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">142</span><span class="p">,</span><span class="w">
  </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Linda"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"rating"</span><span class="p">:</span><span class="w"> </span><span class="mf">4.9</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>

</div>



<p>In C#, you might write:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">DriverDto</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">Rating</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre>

</div>



<p>This works — but it's bloated, mutable, and doesn't reflect the true intent of a DTO: <strong>a simple, structured data carrier</strong>.</p>

<p>Now zoom out from ride-sharing to where DTOs really earn their keep: system boundaries in enterprise software. In a payments platform, DTOs are everywhere:</p>

<ul>
<li>The <strong>inbound webhook payload</strong> from a card scheme or a partner bank notifying you of a settlement.</li>
<li>The <strong>API response</strong> your mobile app receives when a customer checks their balance.</li>
<li>The <strong>Kafka event</strong> published when a transfer moves from <code>PENDING</code> to <code>SETTLED</code>.</li>
<li>The <strong>reconciliation record</strong> you compare against the processor's end-of-day file.</li>
</ul>

<p>Every one of these is a <em>contract</em>. It represents a fact — "this transaction, with this reference, for this amount, at this time" — communicated across a boundary. And here is the key insight the whole article rests on:</p>

<blockquote>
<p><strong>A DTO is a snapshot of data at a point in time. Snapshots don't change. So why are we modeling them with a type whose defining feature is that it changes?</strong></p>
</blockquote>

<p>A junior engineer can think of it this way: a DTO is like a <strong>printed bank statement</strong>. Once it's printed, nobody should be able to grab a pen and change the numbers. If the numbers need to be different, you print a <em>new</em> statement. Classes with <code>set;</code> accessors hand everyone a pen. Records take the pen away.</p>




<h2>
  
  
  🔍 The Real Problems with Class-Based DTOs
</h2>

<p>Let's be precise about what's wrong, because "bloated" alone wouldn't justify changing a decade of habit. There are four concrete failures.</p>

<h3>
  
  
  1. Mutability is a liability at boundaries
</h3>

<p>Consider a simplified inbound payment notification in a fintech platform:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">PaymentNotificationDto</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">TransactionRef</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">decimal</span> <span class="n">Amount</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">Currency</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">SenderAccount</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="n">DateTime</span> <span class="n">ReceivedAt</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre>

</div>



<p>This object will pass through validation, enrichment, fraud screening, ledger posting, and notification services — often across <code>async</code> hops and sometimes across threads. Any one of those stages can <em>silently</em> mutate it. A well-meaning teammate writes:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="c1">// "Normalizing" inside the fraud check — seems harmless</span>
<span class="n">notification</span><span class="p">.</span><span class="n">Amount</span> <span class="p">=</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Round</span><span class="p">(</span><span class="n">notification</span><span class="p">.</span><span class="n">Amount</span><span class="p">,</span> <span class="m">2</span><span class="p">);</span>
</code></pre>

</div>



<p>Now the amount that reaches your ledger is not the amount you received from the partner bank. When reconciliation runs at end of day and finds a ₦0.005 discrepancy across two million transactions, you'll spend a very unpleasant week finding this line. The compiler could have prevented it. With a mutable class, it can't.</p>

<p>In banking, this isn't hypothetical. <strong>The single most valuable property of financial data in flight is that it cannot be tampered with between the boundary and the ledger.</strong> Mutability is an open invitation to tampering — usually accidental, occasionally worse.</p>

<h3>
  
  
  2. Reference equality is the wrong equality
</h3>

<p>Two DTOs carrying identical data are, for every practical purpose, <em>the same fact</em>. But classes compare by reference:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="kt">var</span> <span class="n">a</span> <span class="p">=</span> <span class="k">new</span> <span class="n">PaymentNotificationDto</span> <span class="p">{</span> <span class="n">TransactionRef</span> <span class="p">=</span> <span class="s">"TXN-8842"</span><span class="p">,</span> <span class="n">Amount</span> <span class="p">=</span> <span class="m">50_000m</span><span class="p">,</span> <span class="n">Currency</span> <span class="p">=</span> <span class="s">"NGN"</span> <span class="p">};</span>
<span class="kt">var</span> <span class="n">b</span> <span class="p">=</span> <span class="k">new</span> <span class="n">PaymentNotificationDto</span> <span class="p">{</span> <span class="n">TransactionRef</span> <span class="p">=</span> <span class="s">"TXN-8842"</span><span class="p">,</span> <span class="n">Amount</span> <span class="p">=</span> <span class="m">50_000m</span><span class="p">,</span> <span class="n">Currency</span> <span class="p">=</span> <span class="s">"NGN"</span> <span class="p">};</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">a</span> <span class="p">==</span> <span class="n">b</span><span class="p">);</span>        <span class="c1">// false</span>
<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="nf">Equals</span><span class="p">(</span><span class="n">b</span><span class="p">));</span>   <span class="c1">// false</span>
</code></pre>

</div>



<p>Why does this matter? <strong>Idempotency</strong> — the backbone of every payment system. Partner banks retry webhooks. Kafka delivers at-least-once. Mobile apps resubmit on timeout. Your system must recognize "I've seen this exact fact before" cheaply and correctly. With classes, you either hand-write <code>Equals</code>/<code>GetHashCode</code> (and forget to update them when a property is added — a classic source of subtle dedup bugs), pull in a library, or compare serialized JSON like a barbarian.</p>

<h3>
  
  
  3. The boilerplate hides the contract
</h3>

<p>A class-based DTO with proper equality, immutability via constructor injection, and a useful <code>ToString</code> for structured logging is 40–60 lines. The <em>contract</em> — the thing an engineer actually needs to read — is 5 lines. The other 90% is ceremony that must be maintained, reviewed, and kept in sync. In an enterprise codebase with 400 DTOs, that's tens of thousands of lines of pure noise, every line a place for a bug to hide.</p>

<h3>
  
  
  4. Nothing communicates intent
</h3>

<p><code>public class PaymentNotificationDto</code> tells a reader nothing about how the type is meant to be used. Is it safe to cache? Safe to share across threads? Is mutation expected? The type system is silent, so the answer lives in tribal knowledge and code review vigilance — the two most expensive and least reliable enforcement mechanisms in software.</p>




<h2>
  
  
  ✨ Enter Records: The Type That Says What It Means
</h2>

<p>The same DTO as a record:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">PaymentNotificationDto</span><span class="p">(</span>
    <span class="kt">string</span> <span class="n">TransactionRef</span><span class="p">,</span>
    <span class="kt">decimal</span> <span class="n">Amount</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">Currency</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">SenderAccount</span><span class="p">,</span>
    <span class="n">DateTime</span> <span class="n">ReceivedAt</span><span class="p">);</span>
</code></pre>

</div>



<p>Five lines. And the compiler generates, for free:</p>

<ul>
<li>
<strong>Init-only properties</strong> — the object is frozen after construction.</li>
<li>
<strong>Value-based <code>Equals</code> and <code>GetHashCode</code></strong> — two records with the same data are equal.</li>
<li>
<strong>A readable <code>ToString</code></strong> — <code>PaymentNotificationDto { TransactionRef = TXN-8842, Amount = 50000, ... }</code>, which is a quiet superpower for structured logging in Serilog.</li>
<li>
<strong>Deconstruction</strong> — <code>var (txnRef, amount, currency, _, _) = dto;</code>
</li>
<li>
<strong><code>with</code> expressions</strong> — non-destructive "mutation" that produces a new copy.</li>
</ul>

<p>Our idempotency check now just works:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="kt">var</span> <span class="n">a</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">PaymentNotificationDto</span><span class="p">(</span><span class="s">"TXN-8842"</span><span class="p">,</span> <span class="m">50_000m</span><span class="p">,</span> <span class="s">"NGN"</span><span class="p">,</span> <span class="s">"0123456789"</span><span class="p">,</span> <span class="n">timestamp</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">b</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">PaymentNotificationDto</span><span class="p">(</span><span class="s">"TXN-8842"</span><span class="p">,</span> <span class="m">50_000m</span><span class="p">,</span> <span class="s">"NGN"</span><span class="p">,</span> <span class="s">"0123456789"</span><span class="p">,</span> <span class="n">timestamp</span><span class="p">);</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">a</span> <span class="p">==</span> <span class="n">b</span><span class="p">);</span> <span class="c1">// true — same fact, recognized as such</span>
</code></pre>

</div>



<p>And the tampering bug from earlier? It's now a <strong>compile-time error</strong>:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="n">notification</span><span class="p">.</span><span class="n">Amount</span> <span class="p">=</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Round</span><span class="p">(</span><span class="n">notification</span><span class="p">.</span><span class="n">Amount</span><span class="p">,</span> <span class="m">2</span><span class="p">);</span>
<span class="c1">// CS8852: Init-only property can only be assigned in an object initializer</span>
</code></pre>

</div>



<p>The pen has been taken away. If a stage in your pipeline genuinely needs a normalized amount, it must be explicit about creating a new fact:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="kt">var</span> <span class="n">normalized</span> <span class="p">=</span> <span class="n">notification</span> <span class="k">with</span> <span class="p">{</span> <span class="n">Amount</span> <span class="p">=</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Round</span><span class="p">(</span><span class="n">notification</span><span class="p">.</span><span class="n">Amount</span><span class="p">,</span> <span class="m">2</span><span class="p">)</span> <span class="p">};</span>
</code></pre>

</div>



<p>Notice what happened to the <em>semantics</em>: mutation-in-place (invisible, untraceable) became transformation (visible, reviewable, loggable). In a regulated environment where auditors ask "show me every place this value could have changed," that difference is not cosmetic.</p>




<h2>
  
  
  🏦 Records in the Wild: Enterprise Fintech Scenarios
</h2>

<p>Abstract arguments are cheap. Let's walk through four scenarios that recur in nearly every banking or fintech platform and see how records change the engineering.</p>

<h3>
  
  
  Scenario 1: Idempotent webhook ingestion
</h3>

<p>Your platform receives settlement notifications from multiple partner banks. Networks are unreliable; partners retry aggressively. A duplicate posting means a customer gets credited twice — a direct financial loss.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">SettlementNotification</span><span class="p">(</span>
    <span class="kt">string</span> <span class="n">ProviderRef</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">SessionId</span><span class="p">,</span>
    <span class="kt">decimal</span> <span class="n">Amount</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">Currency</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">BeneficiaryAccount</span><span class="p">,</span>
    <span class="n">DateTimeOffset</span> <span class="n">SettledAt</span><span class="p">);</span>
</code></pre>

</div>



<p>Because records give you correct <code>GetHashCode</code> for free, deduplication within a processing window becomes trivially correct:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="c1">// In-memory dedup for a processing window — HashSet just works</span>
<span class="k">private</span> <span class="k">readonly</span> <span class="n">HashSet</span><span class="p">&lt;</span><span class="n">SettlementNotification</span><span class="p">&gt;</span> <span class="n">_seenInWindow</span> <span class="p">=</span> <span class="k">new</span><span class="p">();</span>

<span class="k">public</span> <span class="k">async</span> <span class="n">Task</span> <span class="nf">HandleAsync</span><span class="p">(</span><span class="n">SettlementNotification</span> <span class="n">notification</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(!</span><span class="n">_seenInWindow</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="n">notification</span><span class="p">))</span>
    <span class="p">{</span>
        <span class="n">_logger</span><span class="p">.</span><span class="nf">LogWarning</span><span class="p">(</span><span class="s">"Duplicate settlement ignored: {Notification}"</span><span class="p">,</span> <span class="n">notification</span><span class="p">);</span>
        <span class="k">return</span><span class="p">;</span> <span class="c1">// structured log includes full payload via generated ToString</span>
    <span class="p">}</span>
    <span class="k">await</span> <span class="n">_ledger</span><span class="p">.</span><span class="nf">PostAsync</span><span class="p">(</span><span class="n">notification</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>

</div>



<p>With a class, <code>HashSet.Add</code> would happily accept ten copies of the same notification, because each is a distinct reference. You'd need hand-rolled equality — and every hand-rolled <code>GetHashCode</code> is a future bug when someone adds <code>NarrationText</code> to the DTO and forgets to update the hash.</p>

<p><em>(In production you'd also have a durable idempotency store keyed on <code>ProviderRef</code> + <code>SessionId</code> — value equality complements that; it doesn't replace it. More on this in the limitations section.)</em></p>

<h3>
  
  
  Scenario 2: Event-driven architecture on Kafka
</h3>

<p>In an event-driven core banking system, events are <strong>facts about the past</strong>: <code>TransferInitiated</code>, <code>FraudCheckPassed</code>, <code>TransferSettled</code>. The first rule of event sourcing is that facts are immutable — you never rewrite history; you append new events.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">TransferInitiated</span><span class="p">(</span>
    <span class="n">Guid</span> <span class="n">TransferId</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">SourceAccount</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">DestinationAccount</span><span class="p">,</span>
    <span class="kt">decimal</span> <span class="n">Amount</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">Currency</span><span class="p">,</span>
    <span class="n">DateTimeOffset</span> <span class="n">InitiatedAt</span><span class="p">)</span> <span class="p">:</span> <span class="n">IDomainEvent</span><span class="p">;</span>
</code></pre>

</div>



<p>When a consumer replays this event during recovery or a new projection is built from the event log, the guarantee that <em>no handler anywhere could have mutated the event</em> is what makes replay deterministic. With mutable class events, one handler that "fixes up" a field poisons every downstream consumer in the same process — and you'll only discover it when a rebuilt projection disagrees with the ledger.</p>

<p>Records make the architectural rule ("events are immutable facts") a <strong>compiler-enforced invariant</strong> instead of a wiki page nobody reads.</p>

<h3>
  
  
  Scenario 3: Maker-checker workflows
</h3>

<p>Regulated back-office operations — bulk account onboarding, limit changes, manual reversals — follow maker-checker: one officer initiates, another approves. The state transition must be explicit and auditable.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">ReversalRequest</span><span class="p">(</span>
    <span class="n">Guid</span> <span class="n">RequestId</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">TransactionRef</span><span class="p">,</span>
    <span class="kt">decimal</span> <span class="n">Amount</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">MakerId</span><span class="p">,</span>
    <span class="kt">string</span><span class="p">?</span> <span class="n">CheckerId</span><span class="p">,</span>
    <span class="n">ApprovalStatus</span> <span class="n">Status</span><span class="p">,</span>
    <span class="n">DateTimeOffset</span> <span class="n">CreatedAt</span><span class="p">,</span>
    <span class="n">DateTimeOffset</span><span class="p">?</span> <span class="n">DecidedAt</span><span class="p">);</span>
</code></pre>

</div>



<p>The <code>with</code> expression models the transition beautifully — the original request is preserved untouched, and approval produces a <em>new</em> state:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="n">ReversalRequest</span> <span class="nf">Approve</span><span class="p">(</span><span class="n">ReversalRequest</span> <span class="n">request</span><span class="p">,</span> <span class="kt">string</span> <span class="n">checkerId</span><span class="p">)</span> <span class="p">=&gt;</span>
    <span class="n">request</span> <span class="k">with</span>
    <span class="p">{</span>
        <span class="n">CheckerId</span> <span class="p">=</span> <span class="n">checkerId</span><span class="p">,</span>
        <span class="n">Status</span> <span class="p">=</span> <span class="n">ApprovalStatus</span><span class="p">.</span><span class="n">Approved</span><span class="p">,</span>
        <span class="n">DecidedAt</span> <span class="p">=</span> <span class="n">_clock</span><span class="p">.</span><span class="n">UtcNow</span>
    <span class="p">};</span>
</code></pre>

</div>



<p>For audit purposes you can log both objects — before and after — and the generated <code>ToString</code> gives the auditor a complete, readable diff. Try producing that with a mutated class: the "before" state is gone; you overwrote it.</p>

<p>This is the <strong>event-sourcing mindset in miniature</strong>: state changes are new values, not edits. Records make that the path of least resistance.</p>

<h3>
  
  
  Scenario 4: End-of-day reconciliation
</h3>

<p>Reconciliation is fundamentally a set-comparison problem: <em>our</em> view of the day's transactions versus <em>their</em> file. Value equality turns this from a bespoke matching engine into LINQ:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">ReconRow</span><span class="p">(</span><span class="kt">string</span> <span class="n">Ref</span><span class="p">,</span> <span class="kt">decimal</span> <span class="n">Amount</span><span class="p">,</span> <span class="kt">string</span> <span class="n">Currency</span><span class="p">,</span> <span class="n">DateOnly</span> <span class="n">ValueDate</span><span class="p">);</span>

<span class="kt">var</span> <span class="n">internalRows</span>  <span class="p">=</span> <span class="k">await</span> <span class="n">_ledger</span><span class="p">.</span><span class="nf">GetRowsAsync</span><span class="p">(</span><span class="n">date</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">providerRows</span>  <span class="p">=</span> <span class="nf">ParseProviderFile</span><span class="p">(</span><span class="n">file</span><span class="p">);</span>

<span class="kt">var</span> <span class="n">missingOnOurSide</span>   <span class="p">=</span> <span class="n">providerRows</span><span class="p">.</span><span class="nf">Except</span><span class="p">(</span><span class="n">internalRows</span><span class="p">);</span>  <span class="c1">// they have it, we don't</span>
<span class="kt">var</span> <span class="n">missingOnTheirSide</span> <span class="p">=</span> <span class="n">internalRows</span><span class="p">.</span><span class="nf">Except</span><span class="p">(</span><span class="n">providerRows</span><span class="p">);</span>  <span class="c1">// we have it, they don't</span>
</code></pre>

</div>



<p><code>Except</code>, <code>Intersect</code>, <code>Distinct</code>, <code>GroupBy</code> — the entire LINQ set-algebra toolkit works <em>correctly by default</em> on records because they carry proper value semantics. With classes you'd be writing <code>IEqualityComparer&lt;T&gt;</code> implementations, one per comparison, each a maintenance liability.</p>




<h2>
  
  
  🧭 How Records Fulfill Software Engineering Principles
</h2>

<p>This is where the article stops being about syntax and starts being about design. Records aren't just terser — they align data contracts with the principles we already claim to follow.</p>

<h3>
  
  
  Single Responsibility Principle (SRP)
</h3>

<p>A DTO has one job: carry data across a boundary. A mutable class quietly takes on a second job — being a <em>workspace</em> that pipeline stages scribble on. That second job is precisely what causes the tampering bugs above. Records structurally reject the second job. The type does one thing, and the compiler enforces it.</p>

<p><strong>Junior-friendly analogy:</strong> a DTO should be an envelope, not a whiteboard. Records seal the envelope.</p>

<h3>
  
  
  Open/Closed Principle (OCP)
</h3>

<p>"Open for extension, closed for modification" is usually discussed for behavior, but it applies to data too. The <code>with</code> expression is OCP for values: you <em>extend</em> an existing fact into a new one without <em>modifying</em> the original.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="kt">var</span> <span class="n">enriched</span> <span class="p">=</span> <span class="n">notification</span> <span class="k">with</span> <span class="p">{</span> <span class="n">Narration</span> <span class="p">=</span> <span class="nf">ResolveNarration</span><span class="p">(</span><span class="n">notification</span><span class="p">)</span> <span class="p">};</span>
</code></pre>

</div>



<p>Every stage of an enrichment pipeline receives an input it cannot break for other consumers and emits a new output. Pipelines composed this way are trivially parallelizable and testable, because no stage has side effects on shared state.</p>

<h3>
  
  
  Liskov Substitution Principle (LSP)
</h3>

<p>Records support inheritance (<code>public record ChildDto : ParentDto</code>) and — unlike hand-written class equality — the generated equality is <em>hierarchy-aware</em>. A record's <code>Equals</code> checks the runtime type via a synthesized <code>EqualityContract</code>, so a <code>ParentDto</code> and a <code>ChildDto</code> with identical property values are correctly <em>not</em> equal. Hand-rolled class equality gets this wrong constantly (the classic symmetric-equality bug in <code>Equals</code> overrides). Records give you LSP-safe equality out of the box.</p>

<p>That said — and this is a genuine senior-level guideline — <strong>prefer flat records and composition for DTOs</strong>. Deep DTO inheritance hierarchies are usually a design smell regardless of the type mechanism. Records just fail more safely when you do it.</p>

<h3>
  
  
  Interface Segregation Principle (ISP)
</h3>

<p>Positional records make fat contracts <em>visible</em>. A 22-property class DTO looks like any other file. A 22-parameter positional record looks alarming in the constructor — and that discomfort is a feature. It nudges you toward segregating the contract:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">BeneficiaryDetails</span><span class="p">(</span><span class="kt">string</span> <span class="n">Account</span><span class="p">,</span> <span class="kt">string</span> <span class="n">BankCode</span><span class="p">,</span> <span class="kt">string</span> <span class="n">Name</span><span class="p">);</span>
<span class="k">public</span> <span class="k">record</span> <span class="nc">TransferAmount</span><span class="p">(</span><span class="kt">decimal</span> <span class="n">Value</span><span class="p">,</span> <span class="kt">string</span> <span class="n">Currency</span><span class="p">);</span>
<span class="k">public</span> <span class="k">record</span> <span class="nc">TransferRequest</span><span class="p">(</span><span class="n">Guid</span> <span class="n">Id</span><span class="p">,</span> <span class="n">TransferAmount</span> <span class="n">Amount</span><span class="p">,</span> <span class="n">BeneficiaryDetails</span> <span class="n">Beneficiary</span><span class="p">);</span>
</code></pre>

</div>



<p>Nested records compose value equality automatically: two <code>TransferRequest</code>s are equal if their nested records are equal, all the way down. You get well-factored, comparable aggregate contracts with zero extra code.</p>

<h3>
  
  
  Dependency Inversion Principle (DIP)
</h3>

<p>DIP is about depending on stable abstractions. In distributed systems, the <em>most</em> stable abstraction between two services is an immutable contract. A record shared in a contracts package is a promise: "this shape, these semantics, no hidden mutation." Consumers can cache it, memoize on it, and key dictionaries by it, all safely — because the contract's stability is enforced, not merely documented.</p>

<h3>
  
  
  YAGNI (You Aren't Gonna Need It)
</h3>

<p>Every <code>set;</code> accessor on a DTO is speculative capability: "someone <em>might</em> need to mutate this someday." YAGNI says: don't build it until they do. Records are YAGNI applied to data — you ship exactly the capability a data carrier needs (construction, reading, comparison, copying) and nothing more. When a genuine mutation need appears, <code>with</code> handles it explicitly, and the code review sees it.</p>

<h3>
  
  
  DRY (Don't Repeat Yourself)
</h3>

<p>The 40 lines of <code>Equals</code>/<code>GetHashCode</code>/<code>ToString</code>/copy-constructor boilerplate per DTO is repetition at industrial scale — the same <em>pattern</em> re-implemented hundreds of times, each an opportunity to diverge. Records move that pattern into the compiler, where it's written once and correct forever. This is DRY in its strongest form: not just avoiding copy-paste, but eliminating the category of code entirely.</p>

<h3>
  
  
  Principle of Least Astonishment
</h3>

<p><code>a == b</code> returning <code>false</code> for two identical payment notifications is astonishing to every engineer who hasn't been burned by it yet. Records make equality behave the way domain intuition expects for data: same values, same fact, equal. Fewer surprises, fewer 2 a.m. debugging sessions.</p>

<h3>
  
  
  Fail Fast
</h3>

<p>Positional records force construction through a single point — the primary constructor — which is exactly where validation belongs:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">TransferAmount</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">decimal</span> <span class="n">Value</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">init</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">Currency</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">init</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="nf">TransferAmount</span><span class="p">(</span><span class="kt">decimal</span> <span class="k">value</span><span class="p">,</span> <span class="kt">string</span> <span class="n">currency</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="k">value</span> <span class="p">&lt;=</span> <span class="m">0</span><span class="p">)</span>
            <span class="k">throw</span> <span class="k">new</span> <span class="nf">ArgumentOutOfRangeException</span><span class="p">(</span><span class="k">nameof</span><span class="p">(</span><span class="k">value</span><span class="p">),</span> <span class="s">"Amount must be positive."</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">currency</span> <span class="k">is</span> <span class="k">not</span> <span class="p">{</span> <span class="n">Length</span><span class="p">:</span> <span class="m">3</span> <span class="p">})</span>
            <span class="k">throw</span> <span class="k">new</span> <span class="nf">ArgumentException</span><span class="p">(</span><span class="s">"ISO 4217 code required"</span><span class="p">,</span> <span class="k">nameof</span><span class="p">(</span><span class="n">currency</span><span class="p">));</span>

        <span class="n">Value</span> <span class="p">=</span> <span class="k">value</span><span class="p">;</span>
        <span class="n">Currency</span> <span class="p">=</span> <span class="n">currency</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre>

</div>



<p>Because the object can't be mutated afterward, <strong>valid at construction means valid forever</strong>. Compare that with a mutable class, where validity is a moving target you must re-verify at every use site.</p>

<h3>
  
  
  DDD: Records <em>are</em> Value Objects
</h3>

<p>If you practice Domain-Driven Design, you've been hand-writing value objects — <code>Money</code>, <code>AccountNumber</code>, <code>Bvn</code>, <code>IdempotencyKey</code> — for years, with all the equality ceremony that entails. Records are the value-object pattern promoted to a language feature. Eric Evans's definition — "an object that describes some characteristic... with no conceptual identity, compared by value" — is a description of a C# record. This is the deepest reason records feel <em>right</em> for DTOs: DTOs were always value objects; we just lacked the language support to say so.</p>

<h3>
  
  
  CQS/CQRS alignment
</h3>

<p>In a CQRS system (MediatR users, this is you), queries return read models and commands carry intent. Both are one-way messages — facts flowing in one direction. Immutable records match that semantics exactly: a <code>GetAccountBalanceQuery</code> or its <code>AccountBalanceResult</code> has no business being mutated after creation. Making commands, queries, and results records turns your MediatR pipeline into a chain of pure-ish transformations, which is dramatically easier to reason about, test, and parallelize.</p>




<h2>
  
  
  ⚡ Performance: What Records Actually Buy You (and What They Don't)
</h2>

<p>Senior engineers should be suspicious of performance claims, so let's be honest and specific.</p>

<h3>
  
  
  Where records genuinely help
</h3>

<p><strong>1. Correct, fast equality without reflection.</strong> The compiler-generated <code>Equals</code> and <code>GetHashCode</code> are direct field comparisons — no reflection, no boxing of the comparands, no serialization tricks. Teams that fall back to comparing DTOs via <code>JsonSerializer.Serialize(a) == JsonSerializer.Serialize(b)</code> (it happens more than anyone admits) are paying two full serializations plus a string comparison per check. Record equality is orders of magnitude cheaper and allocation-free for the comparison itself.</p>

<p><strong>2. Dictionary and set performance by construction.</strong> Because <code>GetHashCode</code> is generated correctly, records are first-class citizens as keys in <code>Dictionary&lt;TKey,TValue&gt;</code>, <code>HashSet&lt;T&gt;</code>, <code>ConcurrentDictionary</code>, and memoization caches. In a fraud-screening service that caches risk scores per <code>(Account, Channel, AmountBand)</code> tuple, a record key gives you O(1) lookups with hash distribution you didn't have to think about.</p>

<p><strong>3. Lock-free sharing under concurrency.</strong> This is the big one for throughput. An immutable object can be read by any number of threads with <strong>zero synchronization</strong>. In a high-TPS inbound payments pipeline — parallel Kafka consumers, <code>Parallel.ForEachAsync</code> enrichment, fan-out to multiple downstream handlers — mutable shared DTOs force you into locks, defensive copies, or prayer. Immutable records eliminate the entire category: no locks, no torn reads, no defensive <code>Clone()</code> calls scattered through the code. The performance win isn't the object itself; it's all the synchronization machinery you get to delete.</p>

<p><strong>4. Defensive copying disappears.</strong> Mature codebases with mutable DTOs accrue defensive copies — "clone it before passing it to that service, just in case." Each copy is allocation and CPU spent to compensate for mutability. With records, passing a reference <em>is</em> safe sharing. The copies you no longer make are a real, measurable saving in hot paths.</p>

<p><strong>5. <code>record struct</code> for the truly hot path.</strong> Since C# 10, <code>readonly record struct</code> gives you value semantics with stack allocation — zero GC pressure for small, short-lived carriers:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">readonly</span> <span class="k">record</span> <span class="nc">struct</span> <span class="nf">FxRate</span><span class="p">(</span><span class="kt">string</span> <span class="n">Pair</span><span class="p">,</span> <span class="kt">decimal</span> <span class="n">Rate</span><span class="p">,</span> <span class="n">DateTimeOffset</span> <span class="n">AsOf</span><span class="p">);</span>
</code></pre>

</div>



<p>For a pricing engine evaluating thousands of FX quotes per second, this avoids heap allocation entirely for the quote objects, which shows up directly in Gen0 collection frequency. The guidance mirrors regular structs: keep them small (≈16 bytes as a rule of thumb, pragmatically a few fields), and prefer <code>readonly record struct</code> to prevent the defensive-copy costs of non-readonly structs.</p>

<h3>
  
  
  Where you must be honest about costs
</h3>

<p><strong><code>with</code> expressions allocate.</strong> Every <code>with</code> produces a full new instance. In a pipeline that transforms a record five times, that's five allocations where a mutable class would have zero. For typical API/webhook DTOs (short-lived, Gen0-collected) this is noise — Gen0 collection of small objects is extremely cheap, and correctness wins. But if profiling shows a genuinely hot loop churning large records through repeated <code>with</code> copies, that's a legitimate case for a builder or a mutable working type <em>inside</em> the tight scope, converting to a record at the boundary.</p>

<p><strong>Record equality is O(n) in fields.</strong> Comparing two 30-property records field-by-field costs more than a reference check. If you're doing millions of comparisons and references would suffice (i.e., you <em>know</em> it's the same instance), <code>ReferenceEquals</code> still exists. This is rarely a real problem, but it's worth knowing the shape of the cost.</p>

<p><strong>The performance argument, summarized for an architect:</strong> records are not "faster objects." They are objects whose guarantees let you <em>delete slower code</em> — locks, defensive copies, hand-rolled comparers, serialization-based equality — and whose struct variant removes allocation where it matters. The system gets faster because the design gets simpler.</p>




<h2>
  
  
  ⚠️ Limitations and Sharp Edges (Read This Before You Migrate)
</h2>

<p>Records are the right default for DTOs. They are not the right choice for everything, and they have gotchas that will bite teams who treat them as "classes but shorter."</p>

<h3>
  
  
  1. Do not use records for EF Core entities
</h3>

<p>This is the most common misapplication. ORM entities are the opposite of DTOs: they have identity (primary key), a lifecycle, and <em>mutation is the mechanism</em> — EF Core's change tracker works by detecting property modifications on tracked instances. Records fight this at every turn: value equality confuses identity-based logic and <code>DbSet</code> semantics, <code>with</code> copies break change tracking (the copy is a <em>different, untracked</em> object), and lazy-loading proxies don't play well with record equality. Keep entities as classes. Map them to record DTOs at the query boundary — which is exactly the layering clean architecture prescribes anyway.</p>

<h3>
  
  
  2. Collection properties break value equality
</h3>

<p>The gotcha that surprises everyone:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">BatchDto</span><span class="p">(</span><span class="kt">string</span> <span class="n">BatchId</span><span class="p">,</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;</span> <span class="n">TransactionRefs</span><span class="p">);</span>

<span class="kt">var</span> <span class="n">a</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">BatchDto</span><span class="p">(</span><span class="s">"B-01"</span><span class="p">,</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;</span> <span class="p">{</span> <span class="s">"T1"</span><span class="p">,</span> <span class="s">"T2"</span> <span class="p">});</span>
<span class="kt">var</span> <span class="n">b</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">BatchDto</span><span class="p">(</span><span class="s">"B-01"</span><span class="p">,</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;</span> <span class="p">{</span> <span class="s">"T1"</span><span class="p">,</span> <span class="s">"T2"</span> <span class="p">});</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">a</span> <span class="p">==</span> <span class="n">b</span><span class="p">);</span> <span class="c1">// FALSE — List&lt;T&gt; compares by reference</span>
</code></pre>

</div>



<p>Generated equality compares each member with its own <code>Equals</code> — and <code>List&lt;T&gt;</code> equality is reference equality. So a record containing a collection silently loses the value-equality guarantee you adopted records for. In a reconciliation or dedup context, this is a <em>correctness</em> bug, not a style issue. Mitigations: use <code>ImmutableArray&lt;T&gt;</code>/<code>ImmutableList&lt;T&gt;</code> with a custom <code>Equals</code> override for that member, model the data to avoid collections in equality-sensitive records, or explicitly override <code>Equals</code>/<code>GetHashCode</code> with sequence comparison. Whatever you choose, make it a documented team convention.</p>

<h3>
  
  
  3. <code>with</code> is a shallow copy
</h3>

<p><code>with</code> copies field values. If a field is a reference to a mutable object (that <code>List&lt;string&gt;</code> again), the original and the copy <strong>share it</strong>:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="kt">var</span> <span class="n">copy</span> <span class="p">=</span> <span class="n">original</span> <span class="k">with</span> <span class="p">{</span> <span class="n">BatchId</span> <span class="p">=</span> <span class="s">"B-02"</span> <span class="p">};</span>
<span class="n">copy</span><span class="p">.</span><span class="n">TransactionRefs</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="s">"T3"</span><span class="p">);</span>   <span class="c1">// also visible through original — same list!</span>
</code></pre>

</div>



<p>The record's own scalar fields are safe; nested mutable state is not. The clean fix is to make records immutable <em>all the way down</em> — nested records, immutable collections — so shallow copy and deep copy become indistinguishable. Half-immutable records are arguably more dangerous than honest mutable classes, because they <em>look</em> safe.</p>

<h3>
  
  
  4. Serializer and framework friction
</h3>

<p>Modern <code>System.Text.Json</code> and current Newtonsoft.Json handle records and constructor binding well, but the wider ecosystem varies: some mappers, legacy binders, and reflection-based tools still assume a parameterless constructor and settable properties. AutoMapper needs <code>ForCtorParam</code> configuration for positional records. If a tool forces you to add <code>set;</code> accessors back onto a record to make it work, you've kept the syntax and lost the point — reconsider the tool or use <code>init</code> with object-initializer-style records.</p>

<h3>
  
  
  5. Inheritance equality can surprise you
</h3>

<p>Record inheritance is safer than hand-rolled class equality, but the <code>EqualityContract</code> behavior — a base-typed variable holding a derived instance never equals a base instance with identical values — surprises engineers who expected structural comparison across the hierarchy. Combined with the general smell of deep DTO hierarchies, the pragmatic rule stands: <strong>flat records, composition over inheritance.</strong></p>

<h3>
  
  
  6. Wide records get unwieldy
</h3>

<p>A positional record with 20+ parameters is miserable to construct and brittle to reorder (positional args have no names at most call sites). For wide contracts, use nominal records with <code>init</code> properties and object initializers, or — better — apply ISP and decompose the contract, as shown earlier.</p>

<h3>
  
  
  7. Migration is not free in a brownfield
</h3>

<p>Introducing records into a 7-year-old codebase means auditing every place that mutates DTOs today. Some of those mutations are bugs you'll be glad to find; others are load-bearing hacks. Migrate boundary-first: new contracts, new events, and new endpoints as records; refactor legacy DTOs opportunistically when you're already touching their pipelines. A big-bang conversion of 400 DTOs is a two-week PR nobody can review.</p>




<h2>
  
  
  🧰 When a Class Is Still the Right Answer
</h2>

<p>To be a trustworthy advocate for records, you have to know their boundary. Reach for a class when the type:</p>

<ul>
<li>
<strong>Has identity and a lifecycle</strong> — ORM entities, aggregate roots, anything where "same object over time despite changing state" is the point.</li>
<li>
<strong>Is fundamentally behavioral</strong> — services, handlers, strategies. Records model <em>data</em>; classes model <em>actors</em>.</li>
<li>
<strong>Requires managed mutable state</strong> — builders, accumulators, caches, connection pools.</li>
<li>
<strong>Must integrate with mutation-assuming frameworks</strong> you can't replace — some legacy binders, certain UI frameworks, older SOAP/WCF tooling.</li>
<li>
<strong>Is a large object copied in a proven hot loop</strong> — where <code>with</code>-copy allocation genuinely dominates a profile (measure first; it almost never does).</li>
</ul>

<p>The mental model to give a junior engineer:</p>

<blockquote>
<p><strong>Records are for facts. Classes are for actors.</strong> A payment notification is a fact. The service that processes it is an actor. Facts don't change; actors do things.</p>
</blockquote>




<h2>
  
  
  📋 A Practical Decision Guide
</h2>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Type of thing</th>
<th>Use</th>
</tr>
</thead>
<tbody>
<tr>
<td>API request/response contracts</td>
<td><code>record</code></td>
</tr>
<tr>
<td>Kafka / message-bus events</td>
<td><code>record</code></td>
</tr>
<tr>
<td>MediatR commands, queries, results</td>
<td><code>record</code></td>
</tr>
<tr>
<td>DDD value objects (<code>Money</code>, <code>AccountNumber</code>)</td>
<td>
<code>record</code> (with constructor validation)</td>
</tr>
<tr>
<td>Small hot-path carriers (FX ticks, coordinates)</td>
<td><code>readonly record struct</code></td>
</tr>
<tr>
<td>EF Core entities / aggregate roots</td>
<td><code>class</code></td>
</tr>
<tr>
<td>Services, handlers, middleware</td>
<td><code>class</code></td>
</tr>
<tr>
<td>Builders, accumulators, mutable caches</td>
<td><code>class</code></td>
</tr>
<tr>
<td>Configuration bound at startup (<code>IOptions</code>)</td>
<td>
<code>record</code> with <code>init</code> properties</td>
</tr>
</tbody>
</table></div>




<h2>
  
  
  🏁 Conclusion: This Was Never About Syntax
</h2>

<p>The <code>record</code> keyword saves you 40 lines per DTO, and that alone would justify using it. But the real argument is architectural:</p>

<p><strong>Mutable class DTOs make correctness a matter of discipline. Records make it a matter of compilation.</strong></p>

<p>In consumer software, the cost of a mutated DTO is a weird bug. In banking and fintech, it's a duplicated settlement, a reconciliation break, a corrupted audit trail — failures with monetary and regulatory consequences. Every principle we invoked — SRP, OCP, YAGNI, DRY, fail-fast, least astonishment, DDD value semantics — converges on the same conclusion: data crossing a boundary should be an immutable, value-comparable fact, and C# now has a first-class type for exactly that.</p>

<p>So the next time you type <code>public class SomethingDto { get; set; }</code>, stop. Ask yourself: is this a fact or an actor? If it's a fact — and a DTO always is — reach for the record, take the pen away, and let the compiler enforce what your code reviews have been trying to enforce for years.</p>

<p>Your reconciliation team will thank you. Eventually. Silently. By never having to call you at 2 a.m. about a ₦0.005 discrepancy.</p>




<p><em>If you found this useful, drop a comment with the worst mutable-DTO bug you've debugged in production — the war stories are half the education.</em></p>

<p><code>LinkedIn Account</code> : <a href="https://tsecurity.de/weiterlesen/3649720/3677861/why-records-are-the-better-choice-for-clean-modern-and-principle-driven-net-development/" target="_blank" rel="noopener noreferrer">LinkedIn</a><br>
<code>Twitter Account</code>: <a href="https://tsecurity.de/weiterlesen/3649720/3677861/why-records-are-the-better-choice-for-clean-modern-and-principle-driven-net-development/" target="_blank" rel="noopener noreferrer">Twitter</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[🛑 Why Records Are the Better Choice for Clean, Modern, and Principle-Driven .NET Development]]></title>
<description><![CDATA[If you've been writing C# for more than a few years, you've written thousands of DTOs. Request models, response models, event payloads, integration contracts, the connective tissue of every distributed system. And if you're like most of us, you've written nearly all of them as classes with { get;...]]></description>
<link>https://tsecurity.de/de/3677853/sichere-programmierung/why-records-are-the-better-choice-for-clean-modern-and-principle-driven-net-development/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3677853/sichere-programmierung/why-records-are-the-better-choice-for-clean-modern-and-principle-driven-net-development/</guid>
<pubDate>Sat, 18 Jul 2026 12:41:39 +0200</pubDate>
<content:encoded><![CDATA[<p>If you've been writing C# for more than a few years, you've written thousands of DTOs. Request models, response models, event payloads, integration contracts, the connective tissue of every distributed system. And if you're like most of us, you've written nearly all of them as classes with <code>{ get; set; }</code> properties, because that's what we've done since .NET Framework 2.0.</p>

<p>Here's the uncomfortable truth: <strong>a mutable class is the wrong data structure for a DTO</strong>, and it has been since C# 9 gave us a better one. Not "stylistically wrong." Wrong in ways that show up as production incidents,  duplicate payments, corrupted audit trails, and race conditions in async pipelines.</p>

<p>This article makes the case from first principles, with examples drawn from banking and fintech systems,  payment processing, reconciliation, maker-checker workflows,  because that's where the cost of getting this wrong is measured in money, not just bugs. Whether you're a junior engineer writing your first API contract or a solutions architect reviewing a payment platform design, the goal is the same: understand <em>why</em> records exist, not just <em>how</em> to type them.</p>




<h2>
  
  
  🚚 What Are DTOs in Practice?
</h2>

<p>Imagine you're building a ride-sharing app like Uber or Bolt. When the frontend requests a list of nearby drivers, you return a <code>DriverDto</code>:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight json"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">142</span><span class="p">,</span><span class="w">
  </span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Linda"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"rating"</span><span class="p">:</span><span class="w"> </span><span class="mf">4.9</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre>

</div>



<p>In C#, you might write:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">DriverDto</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">int</span> <span class="n">Id</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">Name</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">double</span> <span class="n">Rating</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre>

</div>



<p>This works,  but it's bloated, mutable, and doesn't reflect the true intent of a DTO: <strong>a simple, structured data carrier</strong>.</p>

<p>Now zoom out from ride-sharing to where DTOs really earn their keep: system boundaries in enterprise software. In a payments platform, DTOs are everywhere:</p>

<ul>
<li>The <strong>inbound webhook payload</strong> from a card scheme or a partner bank notifying you of a settlement.</li>
<li>The <strong>API response</strong> your mobile app receives when a customer checks their balance.</li>
<li>The <strong>Kafka event</strong> published when a transfer moves from <code>PENDING</code> to <code>SETTLED</code>.</li>
<li>The <strong>reconciliation record</strong> you compare against the processor's end-of-day file.</li>
</ul>

<p>Every one of these is a <em>contract</em>. It represents a fact — "this transaction, with this reference, for this amount, at this time" — communicated across a boundary. And here is the key insight the whole article rests on:</p>

<blockquote>
<p><strong>A DTO is a snapshot of data at a point in time. Snapshots don't change. So why are we modeling them with a type whose defining feature is that it changes?</strong></p>
</blockquote>

<p>A junior engineer can think of it this way: a DTO is like a <strong>printed bank statement</strong>. Once it's printed, nobody should be able to grab a pen and change the numbers. If the numbers need to be different, you print a <em>new</em> statement. Classes with <code>set;</code> accessors hand everyone a pen. Records take the pen away.</p>




<h2>
  
  
  🔍 The Real Problems with Class-Based DTOs
</h2>

<p>Let's be precise about what's wrong, because "bloated" alone wouldn't justify changing a decade of habit. There are four concrete failures.</p>

<h3>
  
  
  1. Mutability is a liability at boundaries
</h3>

<p>Consider a simplified inbound payment notification in a fintech platform:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">class</span> <span class="nc">PaymentNotificationDto</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">TransactionRef</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">decimal</span> <span class="n">Amount</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">Currency</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">SenderAccount</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="n">DateTime</span> <span class="n">ReceivedAt</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">set</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span>
</code></pre>

</div>



<p>This object will pass through validation, enrichment, fraud screening, ledger posting, and notification services,  often across <code>async</code> hops and sometimes across threads. Any one of those stages can <em>silently</em> mutate it. A well-meaning teammate writes:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="c1">// "Normalizing" inside the fraud check — seems harmless</span>
<span class="n">notification</span><span class="p">.</span><span class="n">Amount</span> <span class="p">=</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Round</span><span class="p">(</span><span class="n">notification</span><span class="p">.</span><span class="n">Amount</span><span class="p">,</span> <span class="m">2</span><span class="p">);</span>
</code></pre>

</div>



<p>Now the amount that reaches your ledger is not the amount you received from the partner bank. When reconciliation runs at end of day and finds a ₦0.005 discrepancy across two million transactions, you'll spend a very unpleasant week finding this line. The compiler could have prevented it. With a mutable class, it can't.</p>

<p>In banking, this isn't hypothetical. <strong>The single most valuable property of financial data in flight is that it cannot be tampered with between the boundary and the ledger.</strong> Mutability is an open invitation to tampering,  usually accidental, occasionally worse.</p>

<h3>
  
  
  2. Reference equality is the wrong equality
</h3>

<p>Two DTOs carrying identical data are, for every practical purpose, <em>the same fact</em>. But classes compare by reference:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="kt">var</span> <span class="n">a</span> <span class="p">=</span> <span class="k">new</span> <span class="n">PaymentNotificationDto</span> <span class="p">{</span> <span class="n">TransactionRef</span> <span class="p">=</span> <span class="s">"TXN-8842"</span><span class="p">,</span> <span class="n">Amount</span> <span class="p">=</span> <span class="m">50_000m</span><span class="p">,</span> <span class="n">Currency</span> <span class="p">=</span> <span class="s">"NGN"</span> <span class="p">};</span>
<span class="kt">var</span> <span class="n">b</span> <span class="p">=</span> <span class="k">new</span> <span class="n">PaymentNotificationDto</span> <span class="p">{</span> <span class="n">TransactionRef</span> <span class="p">=</span> <span class="s">"TXN-8842"</span><span class="p">,</span> <span class="n">Amount</span> <span class="p">=</span> <span class="m">50_000m</span><span class="p">,</span> <span class="n">Currency</span> <span class="p">=</span> <span class="s">"NGN"</span> <span class="p">};</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">a</span> <span class="p">==</span> <span class="n">b</span><span class="p">);</span>        <span class="c1">// false</span>
<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="nf">Equals</span><span class="p">(</span><span class="n">b</span><span class="p">));</span>   <span class="c1">// false</span>
</code></pre>

</div>



<p>Why does this matter? <strong>Idempotency</strong> the backbone of every payment system. Partner banks retry webhooks. Kafka delivers at-least-once. Mobile apps resubmit on timeout. Your system must recognize "I've seen this exact fact before" cheaply and correctly. With classes, you either hand-write <code>Equals</code>/<code>GetHashCode</code> (and forget to update them when a property is added — a classic source of subtle dedup bugs), pull in a library, or compare serialized JSON like a barbarian.</p>

<h3>
  
  
  3. The boilerplate hides the contract
</h3>

<p>A class-based DTO with proper equality, immutability via constructor injection, and a useful <code>ToString</code> for structured logging is 40–60 lines. The <em>contract</em> — the thing an engineer actually needs to read,  is 5 lines. The other 90% is ceremony that must be maintained, reviewed, and kept in sync. In an enterprise codebase with 400 DTOs, that's tens of thousands of lines of pure noise, every line a place for a bug to hide.</p>

<h3>
  
  
  4. Nothing communicates intent
</h3>

<p><code>public class PaymentNotificationDto</code> tells a reader nothing about how the type is meant to be used. Is it safe to cache? Safe to share across threads? Is mutation expected? The type system is silent, so the answer lives in tribal knowledge and code review vigilance — the two most expensive and least reliable enforcement mechanisms in software.</p>




<h2>
  
  
  ✨ Enter Records: The Type That Says What It Means
</h2>

<p>The same DTO as a record:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">PaymentNotificationDto</span><span class="p">(</span>
    <span class="kt">string</span> <span class="n">TransactionRef</span><span class="p">,</span>
    <span class="kt">decimal</span> <span class="n">Amount</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">Currency</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">SenderAccount</span><span class="p">,</span>
    <span class="n">DateTime</span> <span class="n">ReceivedAt</span><span class="p">);</span>
</code></pre>

</div>



<p>Five lines. And the compiler generates, for free:</p>

<ul>
<li>
<strong>Init-only properties</strong> - the object is frozen after construction.</li>
<li>
<strong>Value-based <code>Equals</code> and <code>GetHashCode</code></strong> - two records with the same data are equal.</li>
<li>
<strong>A readable <code>ToString</code></strong> - <code>PaymentNotificationDto { TransactionRef = TXN-8842, Amount = 50000, ... }</code>, which is a quiet superpower for structured logging in Serilog.</li>
<li>
<strong>Deconstruction</strong> - <code>var (txnRef, amount, currency, _, _) = dto;</code>
</li>
<li>
<strong><code>with</code> expressions</strong> - non-destructive "mutation" that produces a new copy.</li>
</ul>

<p>Our idempotency check now just works:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="kt">var</span> <span class="n">a</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">PaymentNotificationDto</span><span class="p">(</span><span class="s">"TXN-8842"</span><span class="p">,</span> <span class="m">50_000m</span><span class="p">,</span> <span class="s">"NGN"</span><span class="p">,</span> <span class="s">"0123456789"</span><span class="p">,</span> <span class="n">timestamp</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">b</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">PaymentNotificationDto</span><span class="p">(</span><span class="s">"TXN-8842"</span><span class="p">,</span> <span class="m">50_000m</span><span class="p">,</span> <span class="s">"NGN"</span><span class="p">,</span> <span class="s">"0123456789"</span><span class="p">,</span> <span class="n">timestamp</span><span class="p">);</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">a</span> <span class="p">==</span> <span class="n">b</span><span class="p">);</span> <span class="c1">// true — same fact, recognized as such</span>
</code></pre>

</div>



<p>And the tampering bug from earlier? It's now a <strong>compile-time error</strong>:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="n">notification</span><span class="p">.</span><span class="n">Amount</span> <span class="p">=</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Round</span><span class="p">(</span><span class="n">notification</span><span class="p">.</span><span class="n">Amount</span><span class="p">,</span> <span class="m">2</span><span class="p">);</span>
<span class="c1">// CS8852: Init-only property can only be assigned in an object initializer</span>
</code></pre>

</div>



<p>The pen has been taken away. If a stage in your pipeline genuinely needs a normalized amount, it must be explicit about creating a new fact:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="kt">var</span> <span class="n">normalized</span> <span class="p">=</span> <span class="n">notification</span> <span class="k">with</span> <span class="p">{</span> <span class="n">Amount</span> <span class="p">=</span> <span class="n">Math</span><span class="p">.</span><span class="nf">Round</span><span class="p">(</span><span class="n">notification</span><span class="p">.</span><span class="n">Amount</span><span class="p">,</span> <span class="m">2</span><span class="p">)</span> <span class="p">};</span>
</code></pre>

</div>



<p>Notice what happened to the <em>semantics</em>: mutation-in-place (invisible, untraceable) became transformation (visible, reviewable, loggable). In a regulated environment where auditors ask "show me every place this value could have changed," that difference is not cosmetic.</p>




<h2>
  
  
  🏦 Records in the Wild: Enterprise Fintech Scenarios
</h2>

<p>Abstract arguments are cheap. Let's walk through four scenarios that recur in nearly every banking or fintech platform and see how records change the engineering.</p>

<h3>
  
  
  Scenario 1: Idempotent webhook ingestion
</h3>

<p>Your platform receives settlement notifications from multiple partner banks. Networks are unreliable; partners retry aggressively. A duplicate posting means a customer gets credited twice — a direct financial loss.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">SettlementNotification</span><span class="p">(</span>
    <span class="kt">string</span> <span class="n">ProviderRef</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">SessionId</span><span class="p">,</span>
    <span class="kt">decimal</span> <span class="n">Amount</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">Currency</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">BeneficiaryAccount</span><span class="p">,</span>
    <span class="n">DateTimeOffset</span> <span class="n">SettledAt</span><span class="p">);</span>
</code></pre>

</div>



<p>Because records give you correct <code>GetHashCode</code> for free, deduplication within a processing window becomes trivially correct:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="c1">// In-memory dedup for a processing window — HashSet just works</span>
<span class="k">private</span> <span class="k">readonly</span> <span class="n">HashSet</span><span class="p">&lt;</span><span class="n">SettlementNotification</span><span class="p">&gt;</span> <span class="n">_seenInWindow</span> <span class="p">=</span> <span class="k">new</span><span class="p">();</span>

<span class="k">public</span> <span class="k">async</span> <span class="n">Task</span> <span class="nf">HandleAsync</span><span class="p">(</span><span class="n">SettlementNotification</span> <span class="n">notification</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(!</span><span class="n">_seenInWindow</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="n">notification</span><span class="p">))</span>
    <span class="p">{</span>
        <span class="n">_logger</span><span class="p">.</span><span class="nf">LogWarning</span><span class="p">(</span><span class="s">"Duplicate settlement ignored: {Notification}"</span><span class="p">,</span> <span class="n">notification</span><span class="p">);</span>
        <span class="k">return</span><span class="p">;</span> <span class="c1">// structured log includes full payload via generated ToString</span>
    <span class="p">}</span>
    <span class="k">await</span> <span class="n">_ledger</span><span class="p">.</span><span class="nf">PostAsync</span><span class="p">(</span><span class="n">notification</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>

</div>



<p>With a class, <code>HashSet.Add</code> would happily accept ten copies of the same notification, because each is a distinct reference. You'd need hand-rolled equality — and every hand-rolled <code>GetHashCode</code> is a future bug when someone adds <code>NarrationText</code> to the DTO and forgets to update the hash.</p>

<p><em>(In production you'd also have a durable idempotency store keyed on <code>ProviderRef</code> + <code>SessionId</code> — value equality complements that; it doesn't replace it. More on this in the limitations section.)</em></p>

<h3>
  
  
  Scenario 2: Event-driven architecture on Kafka
</h3>

<p>In an event-driven core banking system, events are <strong>facts about the past</strong>: <code>TransferInitiated</code>, <code>FraudCheckPassed</code>, <code>TransferSettled</code>. The first rule of event sourcing is that facts are immutable — you never rewrite history; you append new events.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">TransferInitiated</span><span class="p">(</span>
    <span class="n">Guid</span> <span class="n">TransferId</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">SourceAccount</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">DestinationAccount</span><span class="p">,</span>
    <span class="kt">decimal</span> <span class="n">Amount</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">Currency</span><span class="p">,</span>
    <span class="n">DateTimeOffset</span> <span class="n">InitiatedAt</span><span class="p">)</span> <span class="p">:</span> <span class="n">IDomainEvent</span><span class="p">;</span>
</code></pre>

</div>



<p>When a consumer replays this event during recovery or a new projection is built from the event log, the guarantee that <em>no handler anywhere could have mutated the event</em> is what makes replay deterministic. With mutable class events, one handler that "fixes up" a field poisons every downstream consumer in the same process — and you'll only discover it when a rebuilt projection disagrees with the ledger.</p>

<p>Records make the architectural rule ("events are immutable facts") a <strong>compiler-enforced invariant</strong> instead of a wiki page nobody reads.</p>

<h3>
  
  
  Scenario 3: Maker-checker workflows
</h3>

<p>Regulated back-office operations — bulk account onboarding, limit changes, manual reversals ,  follow maker-checker: one officer initiates, another approves. The state transition must be explicit and auditable.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">ReversalRequest</span><span class="p">(</span>
    <span class="n">Guid</span> <span class="n">RequestId</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">TransactionRef</span><span class="p">,</span>
    <span class="kt">decimal</span> <span class="n">Amount</span><span class="p">,</span>
    <span class="kt">string</span> <span class="n">MakerId</span><span class="p">,</span>
    <span class="kt">string</span><span class="p">?</span> <span class="n">CheckerId</span><span class="p">,</span>
    <span class="n">ApprovalStatus</span> <span class="n">Status</span><span class="p">,</span>
    <span class="n">DateTimeOffset</span> <span class="n">CreatedAt</span><span class="p">,</span>
    <span class="n">DateTimeOffset</span><span class="p">?</span> <span class="n">DecidedAt</span><span class="p">);</span>
</code></pre>

</div>



<p>The <code>with</code> expression models the transition beautifully — the original request is preserved untouched, and approval produces a <em>new</em> state:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="n">ReversalRequest</span> <span class="nf">Approve</span><span class="p">(</span><span class="n">ReversalRequest</span> <span class="n">request</span><span class="p">,</span> <span class="kt">string</span> <span class="n">checkerId</span><span class="p">)</span> <span class="p">=&gt;</span>
    <span class="n">request</span> <span class="k">with</span>
    <span class="p">{</span>
        <span class="n">CheckerId</span> <span class="p">=</span> <span class="n">checkerId</span><span class="p">,</span>
        <span class="n">Status</span> <span class="p">=</span> <span class="n">ApprovalStatus</span><span class="p">.</span><span class="n">Approved</span><span class="p">,</span>
        <span class="n">DecidedAt</span> <span class="p">=</span> <span class="n">_clock</span><span class="p">.</span><span class="n">UtcNow</span>
    <span class="p">};</span>
</code></pre>

</div>



<p>For audit purposes you can log both objects — before and after — and the generated <code>ToString</code> gives the auditor a complete, readable diff. Try producing that with a mutated class: the "before" state is gone; you overwrote it.</p>

<p>This is the <strong>event-sourcing mindset in miniature</strong>: state changes are new values, not edits. Records make that the path of least resistance.</p>

<h3>
  
  
  Scenario 4: End-of-day reconciliation
</h3>

<p>Reconciliation is fundamentally a set-comparison problem: <em>our</em> view of the day's transactions versus <em>their</em> file. Value equality turns this from a bespoke matching engine into LINQ:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">ReconRow</span><span class="p">(</span><span class="kt">string</span> <span class="n">Ref</span><span class="p">,</span> <span class="kt">decimal</span> <span class="n">Amount</span><span class="p">,</span> <span class="kt">string</span> <span class="n">Currency</span><span class="p">,</span> <span class="n">DateOnly</span> <span class="n">ValueDate</span><span class="p">);</span>

<span class="kt">var</span> <span class="n">internalRows</span>  <span class="p">=</span> <span class="k">await</span> <span class="n">_ledger</span><span class="p">.</span><span class="nf">GetRowsAsync</span><span class="p">(</span><span class="n">date</span><span class="p">);</span>
<span class="kt">var</span> <span class="n">providerRows</span>  <span class="p">=</span> <span class="nf">ParseProviderFile</span><span class="p">(</span><span class="n">file</span><span class="p">);</span>

<span class="kt">var</span> <span class="n">missingOnOurSide</span>   <span class="p">=</span> <span class="n">providerRows</span><span class="p">.</span><span class="nf">Except</span><span class="p">(</span><span class="n">internalRows</span><span class="p">);</span>  <span class="c1">// they have it, we don't</span>
<span class="kt">var</span> <span class="n">missingOnTheirSide</span> <span class="p">=</span> <span class="n">internalRows</span><span class="p">.</span><span class="nf">Except</span><span class="p">(</span><span class="n">providerRows</span><span class="p">);</span>  <span class="c1">// we have it, they don't</span>
</code></pre>

</div>



<p><code>Except</code>, <code>Intersect</code>, <code>Distinct</code>, <code>GroupBy</code> — the entire LINQ set-algebra toolkit works <em>correctly by default</em> on records because they carry proper value semantics. With classes you'd be writing <code>IEqualityComparer&lt;T&gt;</code> implementations, one per comparison, each a maintenance liability.</p>




<h2>
  
  
  🧭 How Records Fulfill Software Engineering Principles
</h2>

<p>This is where the article stops being about syntax and starts being about design. Records aren't just terser — they align data contracts with the principles we already claim to follow.</p>

<h3>
  
  
  Single Responsibility Principle (SRP)
</h3>

<p>A DTO has one job: carry data across a boundary. A mutable class quietly takes on a second job — being a <em>workspace</em> that pipeline stages scribble on. That second job is precisely what causes the tampering bugs above. Records structurally reject the second job. The type does one thing, and the compiler enforces it.</p>

<p><strong>Junior-friendly analogy:</strong> a DTO should be an envelope, not a whiteboard. Records seal the envelope.</p>

<h3>
  
  
  Open/Closed Principle (OCP)
</h3>

<p>"Open for extension, closed for modification" is usually discussed for behavior, but it applies to data too. The <code>with</code> expression is OCP for values: you <em>extend</em> an existing fact into a new one without <em>modifying</em> the original.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="kt">var</span> <span class="n">enriched</span> <span class="p">=</span> <span class="n">notification</span> <span class="k">with</span> <span class="p">{</span> <span class="n">Narration</span> <span class="p">=</span> <span class="nf">ResolveNarration</span><span class="p">(</span><span class="n">notification</span><span class="p">)</span> <span class="p">};</span>
</code></pre>

</div>



<p>Every stage of an enrichment pipeline receives an input it cannot break for other consumers and emits a new output. Pipelines composed this way are trivially parallelizable and testable, because no stage has side effects on shared state.</p>

<h3>
  
  
  Liskov Substitution Principle (LSP)
</h3>

<p>Records support inheritance (<code>public record ChildDto : ParentDto</code>) and — unlike hand-written class equality - the generated equality is <em>hierarchy-aware</em>. A record's <code>Equals</code> checks the runtime type via a synthesized <code>EqualityContract</code>, so a <code>ParentDto</code> and a <code>ChildDto</code> with identical property values are correctly <em>not</em> equal. Hand-rolled class equality gets this wrong constantly (the classic symmetric-equality bug in <code>Equals</code> overrides). Records give you LSP-safe equality out of the box.</p>

<p>That said — and this is a genuine senior-level guideline — <strong>prefer flat records and composition for DTOs</strong>. Deep DTO inheritance hierarchies are usually a design smell regardless of the type mechanism. Records just fail more safely when you do it.</p>

<h3>
  
  
  Interface Segregation Principle (ISP)
</h3>

<p>Positional records make fat contracts <em>visible</em>. A 22-property class DTO looks like any other file. A 22-parameter positional record looks alarming in the constructor — and that discomfort is a feature. It nudges you toward segregating the contract:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">BeneficiaryDetails</span><span class="p">(</span><span class="kt">string</span> <span class="n">Account</span><span class="p">,</span> <span class="kt">string</span> <span class="n">BankCode</span><span class="p">,</span> <span class="kt">string</span> <span class="n">Name</span><span class="p">);</span>
<span class="k">public</span> <span class="k">record</span> <span class="nc">TransferAmount</span><span class="p">(</span><span class="kt">decimal</span> <span class="n">Value</span><span class="p">,</span> <span class="kt">string</span> <span class="n">Currency</span><span class="p">);</span>
<span class="k">public</span> <span class="k">record</span> <span class="nc">TransferRequest</span><span class="p">(</span><span class="n">Guid</span> <span class="n">Id</span><span class="p">,</span> <span class="n">TransferAmount</span> <span class="n">Amount</span><span class="p">,</span> <span class="n">BeneficiaryDetails</span> <span class="n">Beneficiary</span><span class="p">);</span>
</code></pre>

</div>



<p>Nested records compose value equality automatically: two <code>TransferRequest</code>s are equal if their nested records are equal, all the way down. You get well-factored, comparable aggregate contracts with zero extra code.</p>

<h3>
  
  
  Dependency Inversion Principle (DIP)
</h3>

<p>DIP is about depending on stable abstractions. In distributed systems, the <em>most</em> stable abstraction between two services is an immutable contract. A record shared in a contracts package is a promise: "this shape, these semantics, no hidden mutation." Consumers can cache it, memoize on it, and key dictionaries by it, all safely — because the contract's stability is enforced, not merely documented.</p>

<h3>
  
  
  YAGNI (You Aren't Gonna Need It)
</h3>

<p>Every <code>set;</code> accessor on a DTO is speculative capability: "someone <em>might</em> need to mutate this someday." YAGNI says: don't build it until they do. Records are YAGNI applied to data — you ship exactly the capability a data carrier needs (construction, reading, comparison, copying) and nothing more. When a genuine mutation need appears, <code>with</code> handles it explicitly, and the code review sees it.</p>

<h3>
  
  
  DRY (Don't Repeat Yourself)
</h3>

<p>The 40 lines of <code>Equals</code>/<code>GetHashCode</code>/<code>ToString</code>/copy-constructor boilerplate per DTO is repetition at industrial scale — the same <em>pattern</em> re-implemented hundreds of times, each an opportunity to diverge. Records move that pattern into the compiler, where it's written once and correct forever. This is DRY in its strongest form: not just avoiding copy-paste, but eliminating the category of code entirely.</p>

<h3>
  
  
  Principle of Least Astonishment
</h3>

<p><code>a == b</code> returning <code>false</code> for two identical payment notifications is astonishing to every engineer who hasn't been burned by it yet. Records make equality behave the way domain intuition expects for data: same values, same fact, equal. Fewer surprises, fewer 2 a.m. debugging sessions.</p>

<h3>
  
  
  Fail Fast
</h3>

<p>Positional records force construction through a single point — the primary constructor — which is exactly where validation belongs:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">TransferAmount</span>
<span class="p">{</span>
    <span class="k">public</span> <span class="kt">decimal</span> <span class="n">Value</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">init</span><span class="p">;</span> <span class="p">}</span>
    <span class="k">public</span> <span class="kt">string</span> <span class="n">Currency</span> <span class="p">{</span> <span class="k">get</span><span class="p">;</span> <span class="k">init</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">public</span> <span class="nf">TransferAmount</span><span class="p">(</span><span class="kt">decimal</span> <span class="k">value</span><span class="p">,</span> <span class="kt">string</span> <span class="n">currency</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="k">value</span> <span class="p">&lt;=</span> <span class="m">0</span><span class="p">)</span>
            <span class="k">throw</span> <span class="k">new</span> <span class="nf">ArgumentOutOfRangeException</span><span class="p">(</span><span class="k">nameof</span><span class="p">(</span><span class="k">value</span><span class="p">),</span> <span class="s">"Amount must be positive."</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">currency</span> <span class="k">is</span> <span class="k">not</span> <span class="p">{</span> <span class="n">Length</span><span class="p">:</span> <span class="m">3</span> <span class="p">})</span>
            <span class="k">throw</span> <span class="k">new</span> <span class="nf">ArgumentException</span><span class="p">(</span><span class="s">"ISO 4217 code required"</span><span class="p">,</span> <span class="k">nameof</span><span class="p">(</span><span class="n">currency</span><span class="p">));</span>

        <span class="n">Value</span> <span class="p">=</span> <span class="k">value</span><span class="p">;</span>
        <span class="n">Currency</span> <span class="p">=</span> <span class="n">currency</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre>

</div>



<p>Because the object can't be mutated afterward, <strong>valid at construction means valid forever</strong>. Compare that with a mutable class, where validity is a moving target you must re-verify at every use site.</p>

<h3>
  
  
  DDD: Records <em>are</em> Value Objects
</h3>

<p>If you practice Domain-Driven Design, you've been hand-writing value objects — <code>Money</code>, <code>AccountNumber</code>, <code>Bvn</code>, <code>IdempotencyKey</code> — for years, with all the equality ceremony that entails. Records are the value-object pattern promoted to a language feature. Eric Evans's definition — "an object that describes some characteristic... with no conceptual identity, compared by value" — is a description of a C# record. This is the deepest reason records feel <em>right</em> for DTOs: DTOs were always value objects; we just lacked the language support to say so.</p>

<h3>
  
  
  CQS/CQRS alignment
</h3>

<p>In a CQRS system (MediatR users, this is you), queries return read models and commands carry intent. Both are one-way messages — facts flowing in one direction. Immutable records match that semantics exactly: a <code>GetAccountBalanceQuery</code> or its <code>AccountBalanceResult</code> has no business being mutated after creation. Making commands, queries, and results records turns your MediatR pipeline into a chain of pure-ish transformations, which is dramatically easier to reason about, test, and parallelize.</p>




<h2>
  
  
  ⚡ Performance: What Records Actually Buy You (and What They Don't)
</h2>

<p>Senior engineers should be suspicious of performance claims, so let's be honest and specific.</p>

<h3>
  
  
  Where records genuinely help
</h3>

<p><strong>1. Correct, fast equality without reflection.</strong> The compiler-generated <code>Equals</code> and <code>GetHashCode</code> are direct field comparisons - no reflection, no boxing of the comparands, no serialization tricks. Teams that fall back to comparing DTOs via <code>JsonSerializer.Serialize(a) == JsonSerializer.Serialize(b)</code> (it happens more than anyone admits) are paying two full serializations plus a string comparison per check. Record equality is orders of magnitude cheaper and allocation-free for the comparison itself.</p>

<p><strong>2. Dictionary and set performance by construction.</strong> Because <code>GetHashCode</code> is generated correctly, records are first-class citizens as keys in <code>Dictionary&lt;TKey,TValue&gt;</code>, <code>HashSet&lt;T&gt;</code>, <code>ConcurrentDictionary</code>, and memoization caches. In a fraud-screening service that caches risk scores per <code>(Account, Channel, AmountBand)</code> tuple, a record key gives you O(1) lookups with hash distribution you didn't have to think about.</p>

<p><strong>3. Lock-free sharing under concurrency.</strong> This is the big one for throughput. An immutable object can be read by any number of threads with <strong>zero synchronization</strong>. In a high-TPS inbound payments pipeline — parallel Kafka consumers, <code>Parallel.ForEachAsync</code> enrichment, fan-out to multiple downstream handlers — mutable shared DTOs force you into locks, defensive copies, or prayer. Immutable records eliminate the entire category: no locks, no torn reads, no defensive <code>Clone()</code> calls scattered through the code. The performance win isn't the object itself; it's all the synchronization machinery you get to delete.</p>

<p><strong>4. Defensive copying disappears.</strong> Mature codebases with mutable DTOs accrue defensive copies — "clone it before passing it to that service, just in case." Each copy is allocation and CPU spent to compensate for mutability. With records, passing a reference <em>is</em> safe sharing. The copies you no longer make are a real, measurable saving in hot paths.</p>

<p><strong>5. <code>record struct</code> for the truly hot path.</strong> Since C# 10, <code>readonly record struct</code> gives you value semantics with stack allocation — zero GC pressure for small, short-lived carriers:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">readonly</span> <span class="k">record</span> <span class="nc">struct</span> <span class="nf">FxRate</span><span class="p">(</span><span class="kt">string</span> <span class="n">Pair</span><span class="p">,</span> <span class="kt">decimal</span> <span class="n">Rate</span><span class="p">,</span> <span class="n">DateTimeOffset</span> <span class="n">AsOf</span><span class="p">);</span>
</code></pre>

</div>



<p>For a pricing engine evaluating thousands of FX quotes per second, this avoids heap allocation entirely for the quote objects, which shows up directly in Gen0 collection frequency. The guidance mirrors regular structs: keep them small (≈16 bytes as a rule of thumb, pragmatically a few fields), and prefer <code>readonly record struct</code> to prevent the defensive-copy costs of non-readonly structs.</p>

<h3>
  
  
  Where you must be honest about costs
</h3>

<p><strong><code>with</code> expressions allocate.</strong> Every <code>with</code> produces a full new instance. In a pipeline that transforms a record five times, that's five allocations where a mutable class would have zero. For typical API/webhook DTOs (short-lived, Gen0-collected) this is noise — Gen0 collection of small objects is extremely cheap, and correctness wins. But if profiling shows a genuinely hot loop churning large records through repeated <code>with</code> copies, that's a legitimate case for a builder or a mutable working type <em>inside</em> the tight scope, converting to a record at the boundary.</p>

<p><strong>Record equality is O(n) in fields.</strong> Comparing two 30-property records field-by-field costs more than a reference check. If you're doing millions of comparisons and references would suffice (i.e., you <em>know</em> it's the same instance), <code>ReferenceEquals</code> still exists. This is rarely a real problem, but it's worth knowing the shape of the cost.</p>

<p><strong>The performance argument, summarized for an architect:</strong> records are not "faster objects." They are objects whose guarantees let you <em>delete slower code</em> — locks, defensive copies, hand-rolled comparers, serialization-based equality — and whose struct variant removes allocation where it matters. The system gets faster because the design gets simpler.</p>




<h2>
  
  
  ⚠️ Limitations and Sharp Edges (Read This Before You Migrate)
</h2>

<p>Records are the right default for DTOs. They are not the right choice for everything, and they have gotchas that will bite teams who treat them as "classes but shorter."</p>

<h3>
  
  
  1. Do not use records for EF Core entities
</h3>

<p>This is the most common misapplication. ORM entities are the opposite of DTOs: they have identity (primary key), a lifecycle, and <em>mutation is the mechanism</em> — EF Core's change tracker works by detecting property modifications on tracked instances. Records fight this at every turn: value equality confuses identity-based logic and <code>DbSet</code> semantics, <code>with</code> copies break change tracking (the copy is a <em>different, untracked</em> object), and lazy-loading proxies don't play well with record equality. Keep entities as classes. Map them to record DTOs at the query boundary — which is exactly the layering clean architecture prescribes anyway.</p>

<h3>
  
  
  2. Collection properties break value equality
</h3>

<p>The gotcha that surprises everyone:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="k">public</span> <span class="k">record</span> <span class="nc">BatchDto</span><span class="p">(</span><span class="kt">string</span> <span class="n">BatchId</span><span class="p">,</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;</span> <span class="n">TransactionRefs</span><span class="p">);</span>

<span class="kt">var</span> <span class="n">a</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">BatchDto</span><span class="p">(</span><span class="s">"B-01"</span><span class="p">,</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;</span> <span class="p">{</span> <span class="s">"T1"</span><span class="p">,</span> <span class="s">"T2"</span> <span class="p">});</span>
<span class="kt">var</span> <span class="n">b</span> <span class="p">=</span> <span class="k">new</span> <span class="nf">BatchDto</span><span class="p">(</span><span class="s">"B-01"</span><span class="p">,</span> <span class="k">new</span> <span class="n">List</span><span class="p">&lt;</span><span class="kt">string</span><span class="p">&gt;</span> <span class="p">{</span> <span class="s">"T1"</span><span class="p">,</span> <span class="s">"T2"</span> <span class="p">});</span>

<span class="n">Console</span><span class="p">.</span><span class="nf">WriteLine</span><span class="p">(</span><span class="n">a</span> <span class="p">==</span> <span class="n">b</span><span class="p">);</span> <span class="c1">// FALSE — List&lt;T&gt; compares by reference</span>
</code></pre>

</div>



<p>Generated equality compares each member with its own <code>Equals</code> — and <code>List&lt;T&gt;</code> equality is reference equality. So a record containing a collection silently loses the value-equality guarantee you adopted records for. In a reconciliation or dedup context, this is a <em>correctness</em> bug, not a style issue. Mitigations: use <code>ImmutableArray&lt;T&gt;</code>/<code>ImmutableList&lt;T&gt;</code> with a custom <code>Equals</code> override for that member, model the data to avoid collections in equality-sensitive records, or explicitly override <code>Equals</code>/<code>GetHashCode</code> with sequence comparison. Whatever you choose, make it a documented team convention.</p>

<h3>
  
  
  3. <code>with</code> is a shallow copy
</h3>

<p><code>with</code> copies field values. If a field is a reference to a mutable object (that <code>List&lt;string&gt;</code> again), the original and the copy <strong>share it</strong>:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight csharp"><code><span class="kt">var</span> <span class="n">copy</span> <span class="p">=</span> <span class="n">original</span> <span class="k">with</span> <span class="p">{</span> <span class="n">BatchId</span> <span class="p">=</span> <span class="s">"B-02"</span> <span class="p">};</span>
<span class="n">copy</span><span class="p">.</span><span class="n">TransactionRefs</span><span class="p">.</span><span class="nf">Add</span><span class="p">(</span><span class="s">"T3"</span><span class="p">);</span>   <span class="c1">// also visible through original — same list!</span>
</code></pre>

</div>



<p>The record's own scalar fields are safe; nested mutable state is not. The clean fix is to make records immutable <em>all the way down</em> — nested records, immutable collections — so shallow copy and deep copy become indistinguishable. Half-immutable records are arguably more dangerous than honest mutable classes, because they <em>look</em> safe.</p>

<h3>
  
  
  4. Serializer and framework friction
</h3>

<p>Modern <code>System.Text.Json</code> and current Newtonsoft.Json handle records and constructor binding well, but the wider ecosystem varies: some mappers, legacy binders, and reflection-based tools still assume a parameterless constructor and settable properties. AutoMapper needs <code>ForCtorParam</code> configuration for positional records. If a tool forces you to add <code>set;</code> accessors back onto a record to make it work, you've kept the syntax and lost the point — reconsider the tool or use <code>init</code> with object-initializer-style records.</p>

<h3>
  
  
  5. Inheritance equality can surprise you
</h3>

<p>Record inheritance is safer than hand-rolled class equality, but the <code>EqualityContract</code> behavior — a base-typed variable holding a derived instance never equals a base instance with identical values — surprises engineers who expected structural comparison across the hierarchy. Combined with the general smell of deep DTO hierarchies, the pragmatic rule stands: <strong>flat records, composition over inheritance.</strong></p>

<h3>
  
  
  6. Wide records get unwieldy
</h3>

<p>A positional record with 20+ parameters is miserable to construct and brittle to reorder (positional args have no names at most call sites). For wide contracts, use nominal records with <code>init</code> properties and object initializers, or — better — apply ISP and decompose the contract, as shown earlier.</p>

<h3>
  
  
  7. Migration is not free in a brownfield
</h3>

<p>Introducing records into a 7-year-old codebase means auditing every place that mutates DTOs today. Some of those mutations are bugs you'll be glad to find; others are load-bearing hacks. Migrate boundary-first: new contracts, new events, and new endpoints as records; refactor legacy DTOs opportunistically when you're already touching their pipelines. A big-bang conversion of 400 DTOs is a two-week PR nobody can review.</p>




<h2>
  
  
  🧰 When a Class Is Still the Right Answer
</h2>

<p>To be a trustworthy advocate for records, you have to know their boundary. Reach for a class when the type:</p>

<ul>
<li>
<strong>Has identity and a lifecycle</strong> — ORM entities, aggregate roots, anything where "same object over time despite changing state" is the point.</li>
<li>
<strong>Is fundamentally behavioral</strong> — services, handlers, strategies. Records model <em>data</em>; classes model <em>actors</em>.</li>
<li>
<strong>Requires managed mutable state</strong> — builders, accumulators, caches, connection pools.</li>
<li>
<strong>Must integrate with mutation-assuming frameworks</strong> you can't replace — some legacy binders, certain UI frameworks, older SOAP/WCF tooling.</li>
<li>
<strong>Is a large object copied in a proven hot loop</strong> — where <code>with</code>-copy allocation genuinely dominates a profile (measure first; it almost never does).</li>
</ul>

<p>The mental model to give a junior engineer:</p>

<blockquote>
<p><strong>Records are for facts. Classes are for actors.</strong> A payment notification is a fact. The service that processes it is an actor. Facts don't change; actors do things.</p>
</blockquote>




<h2>
  
  
  📋 A Practical Decision Guide
</h2>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Type of thing</th>
<th>Use</th>
</tr>
</thead>
<tbody>
<tr>
<td>API request/response contracts</td>
<td><code>record</code></td>
</tr>
<tr>
<td>Kafka / message-bus events</td>
<td><code>record</code></td>
</tr>
<tr>
<td>MediatR commands, queries, results</td>
<td><code>record</code></td>
</tr>
<tr>
<td>DDD value objects (<code>Money</code>, <code>AccountNumber</code>)</td>
<td>
<code>record</code> (with constructor validation)</td>
</tr>
<tr>
<td>Small hot-path carriers (FX ticks, coordinates)</td>
<td><code>readonly record struct</code></td>
</tr>
<tr>
<td>EF Core entities / aggregate roots</td>
<td><code>class</code></td>
</tr>
<tr>
<td>Services, handlers, middleware</td>
<td><code>class</code></td>
</tr>
<tr>
<td>Builders, accumulators, mutable caches</td>
<td><code>class</code></td>
</tr>
<tr>
<td>Configuration bound at startup (<code>IOptions</code>)</td>
<td>
<code>record</code> with <code>init</code> properties</td>
</tr>
</tbody>
</table></div>




<h2>
  
  
  🏁 Conclusion: This Was Never About Syntax
</h2>

<p>The <code>record</code> keyword saves you 40 lines per DTO, and that alone would justify using it. But the real argument is architectural:</p>

<p><strong>Mutable class DTOs make correctness a matter of discipline. Records make it a matter of compilation.</strong></p>

<p>In consumer software, the cost of a mutated DTO is a weird bug. In banking and fintech, it's a duplicated settlement, a reconciliation break, a corrupted audit trail — failures with monetary and regulatory consequences. Every principle we invoked — SRP, OCP, YAGNI, DRY, fail-fast, least astonishment, DDD value semantics — converges on the same conclusion: data crossing a boundary should be an immutable, value-comparable fact, and C# now has a first-class type for exactly that.</p>

<p>So the next time you type <code>public class SomethingDto { get; set; }</code>, stop. Ask yourself: is this a fact or an actor? If it's a fact — and a DTO always is — reach for the record, take the pen away, and let the compiler enforce what your code reviews have been trying to enforce for years.</p>

<p>Your reconciliation team will thank you. Eventually. Silently. By never having to call you at 2 a.m. about a ₦0.005 discrepancy.</p>




<p><em>If you found this useful, drop a comment with the worst mutable-DTO bug you've debugged in production - the war stories are half the education.</em></p>

<p><code>LinkedIn Account</code> : <a href="https://tsecurity.de/weiterlesen/3649712/3677853/why-records-are-the-better-choice-for-clean-modern-and-principle-driven-net-development/" target="_blank" rel="noopener noreferrer">LinkedIn</a><br>
<code>Twitter Account</code>: <a href="https://tsecurity.de/weiterlesen/3649712/3677853/why-records-are-the-better-choice-for-clean-modern-and-principle-driven-net-development/" target="_blank" rel="noopener noreferrer">Twitter</a><br>
<strong>Credit</strong>: Graphics sourced from <a href="https://tsecurity.de/weiterlesen/3649712/3677853/why-records-are-the-better-choice-for-clean-modern-and-principle-driven-net-development/" target="_blank" rel="noopener noreferrer">Dev.To</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Steve Wozniak's Foundation Partners With Realbotix To Build AI Teacherbot]]></title>
<description><![CDATA["Apple co-founder Steve Wozniak's Woz Ed foundation is partnering with Realbotix, best known for their RealDoll-branded artificial companions, to deploy AI-powered robotic tutors in classrooms," writes Slashdot reader Hentes. "The doll will serve as a sort of artificial teaching assistant, helpin...]]></description>
<link>https://tsecurity.de/de/3677192/it-security-nachrichten/steve-wozniaks-foundation-partners-with-realbotix-to-build-ai-teacherbot/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3677192/it-security-nachrichten/steve-wozniaks-foundation-partners-with-realbotix-to-build-ai-teacherbot/</guid>
<pubDate>Sat, 18 Jul 2026 01:08:32 +0200</pubDate>
<content:encoded><![CDATA["Apple co-founder Steve Wozniak's Woz Ed foundation is partnering with Realbotix, best known for their RealDoll-branded artificial companions, to deploy AI-powered robotic tutors in classrooms," writes Slashdot reader Hentes. "The doll will serve as a sort of artificial teaching assistant, helping students who get stuck or generating lessons. Students will be assigned an ID code, allowing the robot to provide personalized mentoring." NYS Focus reports: "This deployment in a working school district represents a landmark moment for both AI and humanoid robotics," said Andrew Kiguel, CEO of Realbotix, which is currently building the robot. "[Salamanca City Central School District in Western New York] marks the beginning of a new era where humanoid robots and intelligent AI assistants become standard tools in STEM education."
 
The female robot, named Sally, will have a "lifelike appearance" with silicone skin and long brown hair, Kiguel said in an interview with New York Focus. It will be stationary in a seated position but have a wide range of upper-body movements and facial expressions. [...]
 
Salamanca plans to introduce the robot and avatar in its high school AI and robotics courses, which use curriculum developed by Apple co-founder Steve Wozniak to prepare students for high-demand tech jobs. The district plans to expand it to high school students in other classes if the pilot is successful. Realbotix's classroom robot has drawn scrutiny because the company is connected to RealDoll, the longtime maker of hyperrealistic sex dolls and sex robots. Realbotix acquired RealDoll's parent company in 2024 but says the education-focused operation has separate employees, payroll, facilities, and technology, with plans to formally separate the businesses at the ownership level.
 
The "companion robots" are different from sex robots and intended to address what it's described as a "loneliness epidemic." Kiguel has previously said the company's goal is to produce robots and AI that are "indistinguishable from humans."<p></p><div class="share_submission">
<a href="https://tsecurity.de/weiterlesen/3649051/3677192/steve-wozniaks-foundation-partners-with-realbotix-to-build-ai-teacherbot/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
<a href="https://tsecurity.de/weiterlesen/3649051/3677192/steve-wozniaks-foundation-partners-with-realbotix-to-build-ai-teacherbot/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>



</div><p><a href="https://tsecurity.de/weiterlesen/3649051/3677192/steve-wozniaks-foundation-partners-with-realbotix-to-build-ai-teacherbot/" target="_blank" rel="noopener noreferrer">Read more of this story</a> at Slashdot.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Apple ordered to remove 8 'nudify' AI apps from the iPhone's App Store]]></title>
<description><![CDATA[Apple has been accused of "aiding and abetting" the use of "nudify" AI apps on the iPhone, with San Francisco City Attorney David Chiu demanding they be removed from the App Store in a new cease-and-desist letter sent to the company.AI nudity apps are a problem for the App StoreA Wired report not...]]></description>
<link>https://tsecurity.de/de/3676687/apple-ios-macos/apple-ordered-to-remove-8-nudify-ai-apps-from-the-iphones-app-store/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3676687/apple-ios-macos/apple-ordered-to-remove-8-nudify-ai-apps-from-the-iphones-app-store/</guid>
<pubDate>Fri, 17 Jul 2026 19:26:42 +0200</pubDate>
<content:encoded><![CDATA[Apple has been accused of "aiding and abetting" the use of "nudify" AI apps on the iPhone, with San Francisco City Attorney David Chiu demanding they be removed from the <a href="https://tsecurity.de/weiterlesen/3648546/3676687/apple-ordered-to-remove-8-nudify-ai-apps-from-the-iphones-app-store/" target="_blank" rel="noopener noreferrer">App Store</a> in a new cease-and-desist letter sent to the company.<br><br><div><img src="https://photos5.appleinsider.com/gallery/66513-139521-censoredappstore-xl.jpg" alt="Blue rounded square App Store style icon with white stylized letter A, right side heavily pixelated, set against a blurred brown and beige background" height="738" class=""><br><span>AI nudity apps are a problem for the App Store</span></div><br>A <em>Wired</em> <a href="https://tsecurity.de/weiterlesen/3648546/3676687/apple-ordered-to-remove-8-nudify-ai-apps-from-the-iphones-app-store/" target="_blank" rel="noopener noreferrer">report</a> notes that both Apple and Google have been told to prevent the sale of AI apps that can be used to create deepfake images. They must also "sever" business relationships with all of the developers responsible for the apps.<br><br>So-called <a href="https://tsecurity.de/weiterlesen/3648546/3676687/apple-ordered-to-remove-8-nudify-ai-apps-from-the-iphones-app-store/" target="_blank" rel="noopener noreferrer">"nudify" apps</a> have been around for some time. They allow users to create non-consensual intimate images of others, often minors, without the knowledge of the subject.<br><br><br> <a href="https://tsecurity.de/weiterlesen/3648546/3676687/apple-ordered-to-remove-8-nudify-ai-apps-from-the-iphones-app-store/" target="_blank" rel="noopener noreferrer">Continue Reading on AppleInsider</a> | <a href="https://tsecurity.de/weiterlesen/3648546/3676687/apple-ordered-to-remove-8-nudify-ai-apps-from-the-iphones-app-store/" target="_blank" rel="noopener noreferrer">Discuss on our Forums</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[Departing AWS exec Dave Brown is reportedly joining Meta, as Facebook parent mulls its own cloud]]></title>
<description><![CDATA[Dave Brown, the senior AWS executive whose departure Amazon announced this week, is joining Meta to work on its data center build-out, according to a Wall Street Journal report. The move comes as Meta weighs whether to launch a cloud business of its own, which would put it in competition with AWS...]]></description>
<link>https://tsecurity.de/de/3676630/it-nachrichten/departing-aws-exec-dave-brown-is-reportedly-joining-meta-as-facebook-parent-mulls-its-own-cloud/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3676630/it-nachrichten/departing-aws-exec-dave-brown-is-reportedly-joining-meta-as-facebook-parent-mulls-its-own-cloud/</guid>
<pubDate>Fri, 17 Jul 2026 19:18:25 +0200</pubDate>
<content:encoded><![CDATA[<img fetchpriority="high" loading="eager" width="400" height="400" src="https://cdn.geekwire.com/wp-content/uploads/2026/04/dave-brown.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" decoding="async" srcset="https://cdn.geekwire.com/wp-content/uploads/2026/04/dave-brown.jpg 400w, https://cdn.geekwire.com/wp-content/uploads/2026/04/dave-brown-300x300.jpg 300w, https://cdn.geekwire.com/wp-content/uploads/2026/04/dave-brown-150x150.jpg 150w, https://cdn.geekwire.com/wp-content/uploads/2026/04/dave-brown-100x100.jpg 100w, https://cdn.geekwire.com/wp-content/uploads/2026/04/dave-brown-200x200.jpg 200w" sizes="(max-width: 400px) 100vw, 400px"><br>Dave Brown, the senior AWS executive whose departure Amazon announced this week, is joining Meta to work on its data center build-out, according to a Wall Street Journal report. The move comes as Meta weighs whether to launch a cloud business of its own, which would put it in competition with AWS. <a href="https://tsecurity.de/weiterlesen/3648489/3676630/departing-aws-exec-dave-brown-is-reportedly-joining-meta-as-facebook-parent-mulls-its-own-cloud/" target="_blank" rel="noopener noreferrer">Read More</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[Silo Season 3 Episode 4 Release Date, Time, and What to Expect]]></title>
<description><![CDATA[Silo Season 3 Episode 4 will arrive on Apple TV on Friday, July 24, 2026. The next chapter will continue Juliette Nichols’ fight to recover her memories while the Before Times storyline reveals more about the events that led to the creation of the silos.



Season 3 began on July 3 and follows a ...]]></description>
<link>https://tsecurity.de/de/3675994/apple-ios-macos/silo-season-3-episode-4-release-date-time-and-what-to-expect/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3675994/apple-ios-macos/silo-season-3-episode-4-release-date-time-and-what-to-expect/</guid>
<pubDate>Fri, 17 Jul 2026 14:10:37 +0200</pubDate>
<content:encoded><![CDATA[Silo Season 3 Episode 4 will arrive on Apple TV on Friday, July 24, 2026. The next chapter will continue Juliette Nichols’ fight to recover her memories while the Before Times storyline reveals more about the events that led to the creation of the silos.



Season 3 began on July 3 and follows a weekly Friday release schedule. The ten-episode season will run through September 4, 2026.



Silo Season 3 Episode 4 release details




Release date: Friday, July 24, 2026



Release time: 12 a.m. PT and 3 a.m. ET



India release time: Around 12:30 p.m. IST



Streaming platform: Apple TV



Genre: Science fiction, dystopian drama and mystery



Expected duration: Around 45 to 60 minutes



Season episode count: 10 episodes



Season finale: September 4, 2026



Main cast: Rebecca Ferguson, Common, Harriet Walter, Chinaza Uche, Avi Nash, Alexandria Riley, Shane McRae and Remmie Milner




Ashley Zukerman, Jessica Henwick, Laura Innes, Jessica Brown Findlay, Morven Christie, Reed Birney, Matt Craven and Colin Hanks are among the major additions to the Season 3 cast. Steve Zahn also returns after playing Solo in Season 2.



What happened before Episode 4?



Spoilers ahead for Silo Season 3 Episodes 1 to 3.



Season 3 follows two connected timelines. Inside Silo 18, Juliette has returned after surviving her journey outside, but her damaged memories have left her vulnerable. Camille Sims and Nurse Amy have been using memory-altering drugs as part of a wider attempt to control her and weaken any resistance inside the silo.



Juliette gradually learns that other residents have also lost parts of their memories. Patrick Kennedy tells her about the drugs being used to make people forget, while Juliette continues searching for Lukas Kyle and the truth hidden from her.



Meanwhile, the Before Times storyline follows journalist Helen Drew and pilot Charlotte Keene. Helen investigates secret memory-erasure experiments connected to Dr. Crnkovich, while Charlotte begins recovering memories of a suspicious military operation. Their story appears closely tied to the political crisis and possible attack that eventually forced humanity underground.



What to expect from Silo Season 3 Episode 4



Episode 4 will likely push Juliette closer to discovering who altered her memories and why the Algorithm considers her dangerous. Her growing resistance to the medication also puts Camille, Sims and Nurse Amy under pressure, since they can no longer assume that Juliette will remain confused or obedient.



Patrick’s information about the forgetfulness drugs may help Juliette identify more people who were secretly controlled. Lukas could also return to the main storyline, especially because his knowledge of the Legacy and Salvador Quinn’s message makes him important to understanding the silos.



The Before Times plot should continue exploring Helen’s investigation and Charlotte’s recovered memories. Charlotte’s mission may reveal who planned the disaster, what the strange substance was and whether powerful officials helped create the conditions that led to the silo project.



As both timelines develop, Episode 4 should make the connection between Juliette’s present-day struggle and the original architects of the silo system much clearer.



Silo Season 3 Episode 4 streams on Apple TV on July 24. What do you think Juliette will remember next, and how deeply is Camille involved in the plan to control Silo 18? Let us know in the comments.]]></content:encoded>
</item>
<item>
<title><![CDATA[Hide My Email class action lawsuit seeks payout without evidence of any attacks]]></title>
<description><![CDATA[A proposed class action is trying to turn Apple's unresolved Hide My Email flaw into a nationwide payout without alleging that the vulnerability was used in an attack or that the plaintiff's email address was exposed.Apple's Hide My Email serviceAnthony Alvarez filed the lawsuit against Apple on ...]]></description>
<link>https://tsecurity.de/de/3674409/apple-ios-macos/hide-my-email-class-action-lawsuit-seeks-payout-without-evidence-of-any-attacks/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3674409/apple-ios-macos/hide-my-email-class-action-lawsuit-seeks-payout-without-evidence-of-any-attacks/</guid>
<pubDate>Thu, 16 Jul 2026 20:39:27 +0200</pubDate>
<content:encoded><![CDATA[A proposed class action is trying to turn Apple's unresolved Hide My Email flaw into a nationwide payout without alleging that the vulnerability was used in an attack or that the plaintiff's email address was exposed.<br><br><div><img src="https://photos5.appleinsider.com/gallery/68269-143900-967A61C1-FA5C-4CF0-9182-D26130A192AD-xl.jpg" alt="iPhone screen on Hide my email setup page, showing a generated iCloud email address, a text field labeled Test being edited, and part of the keyboard, resting on brown leather surface" height="738"><span>Apple's Hide My Email service</span></div><br>Anthony Alvarez filed the lawsuit against Apple on July 15 in the U.S. District Court for the Northern District of California. The complaint accuses the company of false advertising, fraud, breach of contract, and other violations tied to its marketing of Hide My Email.<br><br>The filing argues that Apple sold customers privacy it couldn't provide. The claims cover the full version included with paid <a href="https://tsecurity.de/weiterlesen/3646268/3674409/hide-my-email-class-action-lawsuit-seeks-payout-without-evidence-of-any-attacks/" target="_blank" rel="noopener noreferrer">iCloud</a>+ plans and the more limited relay addresses generated through Sign in with Apple.<br><br>Alvarez seeks to represent four proposed classes covering U.S. Apple customers, including two California subclasses. The lawsuit seeks damages and an order requiring Apple to fix Hide My Email or clearly disclose its limitations.<br><br><br> <a href="https://tsecurity.de/weiterlesen/3646268/3674409/hide-my-email-class-action-lawsuit-seeks-payout-without-evidence-of-any-attacks/" target="_blank" rel="noopener noreferrer">Continue Reading on AppleInsider</a> | <a href="https://tsecurity.de/weiterlesen/3646268/3674409/hide-my-email-class-action-lawsuit-seeks-payout-without-evidence-of-any-attacks/" target="_blank" rel="noopener noreferrer">Discuss on our Forums</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[Detecting LLM-Generated Text with Classical Machine Learning: Bridging the Gap Between Old and New]]></title>
<description><![CDATA[Originally published on tamiz.pro.


  
  
  The Urgent Need for AI Text Detection


Modern large language models (LLMs) produce text indistinguishable from human writing in many cases. As these systems proliferate, detecting synthetic content has become critical for content moderation, academic ...]]></description>
<link>https://tsecurity.de/de/3674352/sichere-programmierung/detecting-llm-generated-text-with-classical-machine-learning-bridging-the-gap-between-old-and-new/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3674352/sichere-programmierung/detecting-llm-generated-text-with-classical-machine-learning-bridging-the-gap-between-old-and-new/</guid>
<pubDate>Thu, 16 Jul 2026 20:12:17 +0200</pubDate>
<content:encoded><![CDATA[<p><em>Originally published on <a href="https://tsecurity.de/weiterlesen/3646211/3674352/detecting-llm-generated-text-with-classical-machine-learning-bridging-the-gap-between-old-and-new/" target="_blank" rel="noopener noreferrer">tamiz.pro</a>.</em></p>

<h2>
  
  
  The Urgent Need for AI Text Detection
</h2>

<p>Modern large language models (LLMs) produce text indistinguishable from human writing in many cases. As these systems proliferate, detecting synthetic content has become critical for content moderation, academic integrity, and information security. While deep learning dominates current detection research, classical machine learning methods remain valuable for their interpretability, low computational cost, and effectiveness in constrained environments.</p>

<h2>
  
  
  Why Classical ML Still Matters
</h2>

<p>Classical machine learning approaches offer three key advantages:</p>

<ol>
<li>
<strong>Explainability</strong>: Logistic regression coefficients provide clear insight into detection patterns</li>
<li>
<strong>Efficiency</strong>: Models like Naive Bayes require minimal compute resources</li>
<li>
<strong>Interoperability</strong>: Easier integration with legacy systems and real-time pipelines</li>
</ol>

<p>These properties make classical approaches ideal for edge deployments or as complementary systems to deep learning detectors.</p>

<h2>
  
  
  Feature Engineering for LLM Detection
</h2>

<p>Successful classical detection relies on extracting discriminative linguistic features. Key categories include:</p>

<h3>
  
  
  1. N-gram Analysis
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="c1"># Example: Extracting 3-gram frequencies
</span><span class="kn">from</span> <span class="n">collections</span> <span class="kn">import</span> <span class="n">Counter</span>

<span class="k">def</span> <span class="nf">extract_ngrams</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">3</span><span class="p">):</span>
    <span class="n">tokens</span> <span class="o">=</span> <span class="n">text</span><span class="p">.</span><span class="nf">lower</span><span class="p">().</span><span class="nf">split</span><span class="p">()</span>
    <span class="k">return</span> <span class="p">[</span><span class="sh">'</span><span class="s"> </span><span class="sh">'</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">tokens</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="n">n</span><span class="p">])</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">tokens</span><span class="p">)</span><span class="o">-</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)]</span>

<span class="c1"># Human text might show different n-gram distributions
</span><span class="n">human_ngrams</span> <span class="o">=</span> <span class="nf">extract_ngrams</span><span class="p">(</span><span class="sh">"</span><span class="s">The quick brown fox jumps over the lazy dog</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ai_ngrams</span> <span class="o">=</span> <span class="nf">extract_ngrams</span><span class="p">(</span><span class="sh">"</span><span class="s">The rapid brown fox leaps above the dormant canine</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<p>LLMs often generate semantically coherent but statistically anomalous n-gram patterns compared to natural writing.</p>

<h3>
  
  
  2. Syntax Metrics
</h3>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Feature</th>
<th>Human Text</th>
<th>AI Text</th>
</tr>
</thead>
<tbody>
<tr>
<td>Sentence Complexity</td>
<td>Higher variance</td>
<td>More uniform</td>
</tr>
<tr>
<td>Passive Voice Rate</td>
<td>15-20%</td>
<td>5-8%</td>
</tr>
<tr>
<td>Discourse Markers</td>
<td>3-5 per 100 words</td>
<td>0.5-1 per 100 words</td>
</tr>
</tbody>
</table></div>

<p>These metrics can be calculated using libraries like <code>syntok</code> or <code>nltk</code>.</p>

<h3>
  
  
  3. Statistical Anomalies
</h3>

<p>LLM outputs frequently display:</p>

<ul>
<li>More consistent sentence length (lower standard deviation)</li>
<li>Reduced lexical diversity (lower Type-Token Ratio)</li>
<li>Unnatural repetition patterns</li>
</ul>

<h2>
  
  
  Model Selection and Performance
</h2>

<h3>
  
  
  Baseline Approach
</h3>

<ol>
<li>
<strong>Feature Selection</strong>: Combine 2000+ handcrafted features from linguistic patterns</li>
<li>
<strong>Model Training</strong>: Logistic regression with L2 regularization</li>
<li>
<strong>Evaluation</strong>: F1-score typically reaches 78-85% on standard datasets</li>
</ol>

<h3>
  
  
  Advanced Classical Methods
</h3>

<ul>
<li>SVM with TF-IDF weighted n-grams (82-88% F1)</li>
<li>Random Forest with syntax features (76-84% F1)</li>
<li>Gradient Boosting on combined features (85-90% F1)</li>
</ul>

<p>These results approach but don't yet surpass deep learning models (93-97% F1), but maintain advantages in edge cases.</p>

<h2>
  
  
  Challenges and Solutions
</h2>

<h3>
  
  
  1. Distribution Shift
</h3>

<p>LLMs evolve rapidly while classical models require retraining. Solution: Use adaptive training pipelines that ingest new human/LLM samples weekly.</p>

<h3>
  
  
  2. Feature Engineering Complexity
</h3>

<p>Manual feature creation is labor-intensive. Consider automated feature selection:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="kn">from</span> <span class="n">sklearn.feature_selection</span> <span class="kn">import</span> <span class="n">SelectKBest</span>
<span class="n">selector</span> <span class="o">=</span> <span class="nc">SelectKBest</span><span class="p">(</span><span class="n">score_func</span><span class="o">=</span><span class="n">chi2</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">500</span><span class="p">)</span> <span class="c1"># Select top 500 features
</span><span class="n">X_selected</span> <span class="o">=</span> <span class="n">selector</span><span class="p">.</span><span class="nf">fit_transform</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span>
</code></pre>

</div>



<h3>
  
  
  3. Model Interpretability
</h3>

<p>Use SHAP values to visualize feature importance:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">explainer</span> <span class="o">=</span> <span class="n">shap</span><span class="p">.</span><span class="nc">LinearExplainer</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
<span class="n">shap_values</span> <span class="o">=</span> <span class="n">explainer</span><span class="p">.</span><span class="nf">shap_values</span><span class="p">(</span><span class="n">X_test</span><span class="p">)</span>
<span class="n">shap</span><span class="p">.</span><span class="nf">summary_plot</span><span class="p">(</span><span class="n">shap_values</span><span class="p">,</span> <span class="n">X_test</span><span class="p">)</span>
</code></pre>

</div>



<p>This helps validate that models are learning meaningful patterns (e.g., detecting unnatural conjunction usage).</p>

<h2>
  
  
  Future Directions
</h2>

<ol>
<li>
<strong>Hybrid Approaches</strong>: Combine classical models with lightweight neural networks</li>
<li>
<strong>Feature Evolution</strong>: Incorporate new LLM-specific metrics</li>
<li>
<strong>Ensemble Systems</strong>: Create detection stacks that blend ML generations</li>
</ol>

<p>While deep learning will dominate cutting-edge detection research, classical methods provide essential capabilities in deployment scenarios with limited compute resources. The best detection systems of the future will likely integrate both paradigms, using classical models for real-time filtering and deep learning for final classification.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Anzeige: Lego DeLorean aus Zurück in die Zukunft bei Amazon nie billiger]]></title>
<description><![CDATA[Der viel gekaufte Lego DeLorean mit Marty und Doc Brown als Minifiguren ist erneut zum bisher besten Amazon-Preis zu haben. (Lego, Technik/Hardware)]]></description>
<link>https://tsecurity.de/de/3674232/it-nachrichten/anzeige-lego-delorean-aus-zurueck-in-die-zukunft-bei-amazon-nie-billiger/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3674232/it-nachrichten/anzeige-lego-delorean-aus-zurueck-in-die-zukunft-bei-amazon-nie-billiger/</guid>
<pubDate>Thu, 16 Jul 2026 19:03:18 +0200</pubDate>
<content:encoded><![CDATA[Der viel gekaufte Lego DeLorean mit Marty und Doc Brown als Minifiguren ist erneut zum bisher besten Amazon-Preis zu haben. (<a href="https://tsecurity.de/weiterlesen/3646091/3674232/anzeige-lego-delorean-aus-zurueck-in-die-zukunft-bei-amazon-nie-billiger/" target="_blank" rel="noopener noreferrer">Lego</a>, <a href="https://tsecurity.de/weiterlesen/3646091/3674232/anzeige-lego-delorean-aus-zurueck-in-die-zukunft-bei-amazon-nie-billiger/" target="_blank" rel="noopener noreferrer">Technik/Hardware</a>) <img src="https://cpx.golem.de/cpx.php?class=17&amp;aid=210972&amp;page=1&amp;ts=1784221021" alt="" width="1" height="1">]]></content:encoded>
</item>
<item>
<title><![CDATA[Amazon Web Services' most vocal customer now runs EC2]]></title>
<description><![CDATA[Retail foundation leader Dave Treadwell takes over as senior leader and 19-year vet Dave Brown departs for pastures unknown]]></description>
<link>https://tsecurity.de/de/3672000/it-nachrichten/amazon-web-services-most-vocal-customer-now-runs-ec2/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3672000/it-nachrichten/amazon-web-services-most-vocal-customer-now-runs-ec2/</guid>
<pubDate>Thu, 16 Jul 2026 00:02:24 +0200</pubDate>
<content:encoded><![CDATA[Retail foundation leader Dave Treadwell takes over as senior leader and 19-year vet Dave Brown departs for pastures unknown]]></content:encoded>
</item>
<item>
<title><![CDATA[AWS EC2 and AI leader Dave Brown to exit, replaced by Amazon exec and Microsoft vet Dave Treadwell]]></title>
<description><![CDATA[Dave Brown is leaving Amazon Web Services after nearly 19 years, departing at the end of July for a new role outside the company. Dave Treadwell, a longtime Amazon executive who spent 27 years at Microsoft, will take over AWS Compute and ML Services on Aug. 1. Read More]]></description>
<link>https://tsecurity.de/de/3671790/it-nachrichten/aws-ec2-and-ai-leader-dave-brown-to-exit-replaced-by-amazon-exec-and-microsoft-vet-dave-treadwell/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3671790/it-nachrichten/aws-ec2-and-ai-leader-dave-brown-to-exit-replaced-by-amazon-exec-and-microsoft-vet-dave-treadwell/</guid>
<pubDate>Wed, 15 Jul 2026 22:18:04 +0200</pubDate>
<content:encoded><![CDATA[<img fetchpriority="high" loading="eager" width="1260" height="841" src="https://cdn.geekwire.com/wp-content/uploads/2023/11/dave-brown-1260x841.jpg" class="webfeedsFeaturedVisual wp-post-image" alt="" decoding="async" srcset="https://cdn.geekwire.com/wp-content/uploads/2023/11/dave-brown-1260x841.jpg 1260w, https://cdn.geekwire.com/wp-content/uploads/2023/11/dave-brown-768x513.jpg 768w, https://cdn.geekwire.com/wp-content/uploads/2023/11/dave-brown-1536x1026.jpg 1536w, https://cdn.geekwire.com/wp-content/uploads/2023/11/dave-brown-2048x1367.jpg 2048w, https://cdn.geekwire.com/wp-content/uploads/2023/11/dave-brown-630x421.jpg 630w" sizes="(max-width: 1260px) 100vw, 1260px"><br>Dave Brown is leaving Amazon Web Services after nearly 19 years, departing at the end of July for a new role outside the company. Dave Treadwell, a longtime Amazon executive who spent 27 years at Microsoft, will take over AWS Compute and ML Services on Aug. 1. <a href="https://tsecurity.de/weiterlesen/3643649/3671790/aws-ec2-and-ai-leader-dave-brown-to-exit-replaced-by-amazon-exec-and-microsoft-vet-dave-treadwell/" target="_blank" rel="noopener noreferrer">Read More</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[OpenAI blames email mixup for why it didn't respond to Apple trade theft claims]]></title>
<description><![CDATA[It seemed as if the last straw for Apple was how OpenAI failed to respond to complaints about trade secret theft, but the ChatGPT maker says it did reply and the real problem is a lack of attention to detail by Apple's lawyers.OpenAI CEO Sam Altman - image credit: Emerson CollectiveApple is suing...]]></description>
<link>https://tsecurity.de/de/3671064/apple-ios-macos/openai-blames-email-mixup-for-why-it-didnt-respond-to-apple-trade-theft-claims/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3671064/apple-ios-macos/openai-blames-email-mixup-for-why-it-didnt-respond-to-apple-trade-theft-claims/</guid>
<pubDate>Wed, 15 Jul 2026 16:57:07 +0200</pubDate>
<content:encoded><![CDATA[It seemed as if the last straw for Apple was how OpenAI failed to respond to complaints about trade secret theft, but the ChatGPT maker says it did reply and the real problem is a lack of attention to detail by Apple's lawyers.<br><br><div><img src="https://photos5.appleinsider.com/gallery/68254-143883-000-lead-Sam-Altman-xl.jpg" alt="Man with short brown hair wearing a tan long sleeve shirt and clip-on microphone, seated against a dark background, looking slightly to the side with a neutral thoughtful expression" height="720" class=""><br><span>OpenAI CEO Sam Altman - image credit: Emerson Collective</span></div><br>Apple is <a href="https://tsecurity.de/weiterlesen/3642923/3671064/openai-blames-email-mixup-for-why-it-didnt-respond-to-apple-trade-theft-claims/" target="_blank" rel="noopener noreferrer">suing OpenAI</a> over alleged theft of intellectual property, and initially the firm's response was an <a href="https://tsecurity.de/weiterlesen/3642923/3671064/openai-blames-email-mixup-for-why-it-didnt-respond-to-apple-trade-theft-claims/" target="_blank" rel="noopener noreferrer">empty claim</a> of being unaware of the issue. However, as <a href="https://tsecurity.de/weiterlesen/3642923/3671064/openai-blames-email-mixup-for-why-it-didnt-respond-to-apple-trade-theft-claims/" target="_blank" rel="noopener noreferrer">first spotted</a> by <em>NBC</em>, OpenAI's lawyers are now concentrating on an issue they seem to think derails the whole suit.<br><br>Reportedly, despite Apple saying that OpenAI failed to even respond to its allegations of trade secret theft, the company says it did. A source that is unknown but difficult not to guess, has shared OpenAI emails with NBC and they apparently do confirm that the firm responded.<br><br><br> <a href="https://tsecurity.de/weiterlesen/3642923/3671064/openai-blames-email-mixup-for-why-it-didnt-respond-to-apple-trade-theft-claims/" target="_blank" rel="noopener noreferrer">Continue Reading on AppleInsider</a> | <a href="https://tsecurity.de/weiterlesen/3642923/3671064/openai-blames-email-mixup-for-why-it-didnt-respond-to-apple-trade-theft-claims/" target="_blank" rel="noopener noreferrer">Discuss on our Forums</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[What Is GPT? A Practical Guide to Tokens, Transformers, Training, and Fine-Tuning]]></title>
<description><![CDATA[Artificial intelligence systems can now write articles, explain scientific concepts, generate software code, summarize documents, and participate in remarkably natural conversations. At the center of this development is a class of language models commonly associated with three letters: GPT.

Desp...]]></description>
<link>https://tsecurity.de/de/3669106/sichere-programmierung/what-is-gpt-a-practical-guide-to-tokens-transformers-training-and-fine-tuning/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3669106/sichere-programmierung/what-is-gpt-a-practical-guide-to-tokens-transformers-training-and-fine-tuning/</guid>
<pubDate>Tue, 14 Jul 2026 22:42:06 +0200</pubDate>
<content:encoded><![CDATA[<p>Artificial intelligence systems can now write articles, explain scientific concepts, generate software code, summarize documents, and participate in remarkably natural conversations. At the center of this development is a class of language models commonly associated with three letters: GPT.</p>

<p>Despite its widespread use, GPT is often described too simply. It is not merely a chatbot, a search engine, or a database containing prepared answers. GPT is a neural language model trained to process sequences of tokens and predict what should come next.</p>

<p>Understanding GPT therefore requires looking beyond the chat interface. We need to examine tokenization, Transformer architecture, pre-training, parameters, post-training, and the statistical process through which a model produces language.</p>

<p>What Does GPT Stand For?</p>

<p>GPT stands for Generative Pre-trained Transformer. Each word describes a fundamental part of the system.</p>

<p>Generative means that the model can produce new sequences, such as text, code, structured data, or other token-based outputs.</p>

<p>Pre-trained means that the model first learns general patterns from a large collection of data before it is adapted for specific tasks or conversational behavior.</p>

<p>Transformer refers to the neural-network architecture on which GPT is based.</p>

<p>The Transformer architecture was introduced by Vaswani and colleagues in the 2017 paper Attention Is All You Need. Unlike earlier sequence models that depended heavily on recurrent neural networks, the Transformer used attention mechanisms to process relationships between elements in a sequence more efficiently and in parallel.</p>

<p>The original GPT research applied generative pre-training to a Transformer-based language model. The central idea was to first train a general-purpose model on unlabelled text and then adapt it to downstream language tasks. This combination of large-scale pre-training and task-specific adaptation became one of the foundations of modern natural language processing.</p>

<p>GPT Does Not Read Text Directly</p>

<p>Before text can be processed by GPT, it must be converted into smaller units called tokens.</p>

<p>A token is not necessarily a complete word. Depending on the tokenizer, a token may represent:</p>

<p>A complete word<br>
Part of a word<br>
A punctuation mark<br>
A number<br>
A whitespace pattern<br>
A byte or character sequence</p>

<p>For example, a tokenizer might represent a common word with one token while dividing an uncommon technical term into several subword tokens. The exact division depends on the tokenizer’s vocabulary and training method.</p>

<p>Subword tokenization methods became important because a fixed word-level vocabulary cannot efficiently represent every possible word, spelling variation, technical term, or newly created expression. Byte Pair Encoding, commonly abbreviated as BPE, was adapted for neural language processing to represent rare words as sequences of smaller subword units.</p>

<p>A simplified GPT processing pipeline looks like this:</p>

<p>User text<br>
    ↓<br>
Tokenizer<br>
    ↓<br>
Token IDs<br>
    ↓<br>
Token embeddings<br>
    ↓<br>
Transformer layers<br>
    ↓<br>
Probability distribution over the vocabulary<br>
    ↓<br>
Selected next token<br>
    ↓<br>
Generated text</p>

<p>After tokenization, each token is mapped to a numerical identifier. The model then converts these identifiers into vectors known as embeddings. These vectors provide the mathematical representations that the Transformer processes.</p>

<p>Tokenization is not a minor preprocessing detail. It affects context length, multilingual performance, numerical representation, generation speed, and the model’s ability to process domain-specific terminology.</p>

<p>The Central Objective: Predict the Next Token</p>

<p>At the core of a GPT model is a deceptively simple training objective: predict the next token from the tokens that came before it.</p>

<p>Given a sequence of tokens</p>

<p>[<br>
x_1, x_2, x_3, \ldots, x_t,<br>
]</p>

<p>the model estimates the probability of the next token:</p>

<p>[<br>
P(x_t \mid x_1, x_2, \ldots, x_{t-1}).<br>
]</p>

<p>During training, the model repeatedly compares its prediction with the actual next token in the training data. The difference between the prediction and the correct answer is measured through a loss function, commonly cross-entropy loss. The model’s parameters are then adjusted to reduce that error.</p>

<p>A simplified language-model training objective can be expressed as:</p>

<p>[<br>
\mathcal{L} = -\sum_{t=1}^{T}\log P(x_t \mid x_{&lt;t}).<br>
]</p>

<p>This process is repeated across extremely large numbers of token sequences. Through next-token prediction, the model gradually learns grammatical structures, semantic relationships, writing patterns, factual associations, programming syntax, and recurring forms of reasoning found in its training data. The original GPT work formalized this autoregressive language-modeling objective using a multi-layer Transformer decoder.</p>

<p>When the model generates an answer, it uses the same basic mechanism. It calculates a probability distribution over its vocabulary, selects a token according to the decoding strategy, adds that token to the sequence, and repeats the process.</p>

<p>Input: "The capital of France is"</p>

<p>Prediction 1: " Paris"<br>
New sequence: "The capital of France is Paris"</p>

<p>Prediction 2: "."<br>
New sequence: "The capital of France is Paris."</p>

<p>Prediction 3: End of response</p>

<p>The model does not normally produce an entire paragraph in a single step. It generates the response sequentially, one token at a time.</p>

<p>How Self-Attention Works</p>

<p>The defining component of the Transformer is self-attention.</p>

<p>Self-attention allows each token representation to incorporate information from other relevant tokens in the sequence. Consider the sentence:</p>

<p>The programmer fixed the server because it had stopped responding.</p>

<p>To interpret the word “it,” the model must represent its relationship with earlier words such as “server.” Attention mechanisms help the model calculate these contextual relationships.</p>

<p>Within an attention layer, token representations are projected into three kinds of vectors:</p>

<p>Query<br>
Key<br>
Value</p>

<p>The standard scaled dot-product attention operation is expressed as:</p>

<p>\text{softmax}<br>
\left(<br>
\frac{QK^\top}{\sqrt{d_k}}<br>
\right)V.<br>
]</p>

<p>The query and key vectors determine how strongly different positions should attend to one another. The value vectors contain the information combined to create the resulting contextual representation.</p>

<p>Transformers generally use multi-head attention, meaning that several attention operations are performed in parallel. Different attention heads can learn to represent different kinds of relationships, although individual heads do not necessarily correspond to clean, human-defined linguistic rules.</p>

<p>GPT models use a causal attention mask. This prevents a token from accessing future tokens during ordinary autoregressive training. When predicting token (x_t), the model may use tokens before (x_t), but it cannot look ahead at the correct answer.</p>

<p>A GPT layer also contains feed-forward neural networks, residual connections, and normalization operations. By stacking many such layers, the model constructs increasingly contextual representations of the input sequence.</p>

<p>What Does Pre-Training Teach the Model?</p>

<p>During pre-training, a GPT model is exposed to a large corpus of tokenized data and optimized for next-token prediction.</p>

<p>The data may contain many forms of language, including prose, technical documents, conversations, educational material, and source code. The exact dataset, filtering procedure, and mixture vary between models.</p>

<p>Pre-training does not usually provide the model with an explicit database of facts or a manually designed grammar. Instead, the model learns distributed statistical representations through optimization.</p>

<p>For example, the model is not necessarily given a formal rule stating that a verb must agree with its subject. It encounters many examples in which grammatical agreement occurs and adjusts its parameters in ways that make grammatically consistent continuations more probable.</p>

<p>This training process also allows sufficiently capable models to perform tasks that were not represented as separate training objectives. GPT-3 demonstrated that a large autoregressive language model could perform many tasks through instructions or a small number of examples placed directly in the prompt, without additional gradient-based fine-tuning for each task. This behavior became known as zero-shot, one-shot, and few-shot learning.</p>

<p>More precisely, this is often called in-context learning. The model adapts its output according to patterns in the current context, but its underlying parameters are not normally updated during the conversation.</p>

<p>What Are Model Parameters?</p>

<p>Parameters are numerical values learned during training. They include the weights used by attention projections, feed-forward networks, embeddings, and other components of the model.</p>

<p>Parameters determine how information is transformed as it passes through the network. They are not individual facts that can normally be inspected as simple entries such as:</p>

<p>Parameter 8,217,491 = "Paris is the capital of France"</p>

<p>Knowledge is distributed across many parameters and internal representations.</p>

<p>Increasing the parameter count can increase a model’s capacity, but parameter count alone does not determine quality. Performance also depends on factors such as:</p>

<p>Training-data quantity and quality<br>
Tokenizer design<br>
Model architecture<br>
Optimization procedure<br>
Training compute<br>
Context length<br>
Post-training data<br>
Evaluation methodology</p>

<p>Research on neural scaling laws found predictable relationships between language-model loss, model size, dataset size, and training compute across broad experimental ranges. However, these findings do not imply that simply increasing parameter count will automatically produce a more helpful or reliable assistant.</p>

<p>The InstructGPT experiments provide a useful example. Human evaluators preferred the outputs of a 1.3-billion-parameter instruction-tuned model over those of the much larger 175-billion-parameter GPT-3 base model on the researchers’ prompt distribution. This demonstrated the importance of post-training and alignment rather than parameter count alone.</p>

<p>A Base GPT Model Is Not Automatically a Chatbot</p>

<p>A model trained only with next-token prediction is generally called a base model.</p>

<p>Base models can complete text, imitate styles, answer some questions, and perform tasks through prompting. However, their fundamental objective is to continue sequences in statistically plausible ways. They are not automatically optimized to act as helpful conversational assistants.</p>

<p>Turning a base model into an instruction-following assistant usually requires additional post-training.</p>

<p>A simplified post-training pipeline may include:</p>

<p>Supervised Fine-Tuning</p>

<p>Human-written or curated examples are used to teach the model how to respond to instructions.</p>

<p>A training example might contain:</p>

<p>Instruction:<br>
Explain photosynthesis to a twelve-year-old.</p>

<p>Desired response:<br>
Plants use sunlight to convert water and carbon dioxide into...</p>

<p>The model is trained to make the desired response more probable when presented with similar instructions.</p>

<p>Preference Training</p>

<p>Several possible model responses are compared and ranked. These preferences provide information about which outputs are more helpful, accurate, clear, or safe.</p>

<p>Reinforcement Learning from Human Feedback</p>

<p>In the classical RLHF pipeline, preference comparisons are used to train a reward model. The language model is then optimized to produce responses receiving higher predicted rewards.</p>

<p>The InstructGPT study combined supervised demonstrations with ranked model outputs and reinforcement learning from human feedback. Its results showed that post-training could substantially improve instruction following and human preference ratings.</p>

<p>GPT and ChatGPT Are Not the Same Thing</p>

<p>GPT refers to the underlying family of generative Transformer models and the associated architectural and training approach.</p>

<p>ChatGPT is a conversational system designed to interact with users through dialogue. Its behavior depends not only on a language model but also on post-training, conversation formatting, system instructions, safety mechanisms, and—in some implementations—external tools.</p>

<p>OpenAI introduced ChatGPT as a dialogue-oriented sibling of InstructGPT, trained to respond conversationally and handle follow-up questions.</p>

<p>The distinction can be summarized as follows:</p>

<p>GPT:<br>
The underlying generative language-model family.</p>

<p>ChatGPT:<br>
A conversational product and system built around language models.</p>

<p>Similarly, large language model, or LLM, is a broader category. Not every LLM is a GPT model. Other language-model families may use different architectures, training procedures, tokenizers, licensing models, or multimodal components.</p>

<p>Fine-Tuning GPT Models</p>

<p>Pre-training produces a general-purpose model, but organizations often need models adapted to particular domains, languages, formats, or behaviors.</p>

<p>Full fine-tuning updates all or most of the model’s parameters. While this can be effective, it requires substantial GPU memory, storage, and computational resources for large models.</p>

<p>Parameter-efficient fine-tuning methods attempt to reduce these requirements.</p>

<p>LoRA</p>

<p>Low-Rank Adaptation, or LoRA, freezes the original model weights and introduces smaller trainable matrices into selected layers.</p>

<p>Instead of directly learning a complete weight update (\Delta W), LoRA approximates it using two lower-rank matrices:</p>

<p>[<br>
\Delta W = BA,<br>
]</p>

<p>where the selected rank is much smaller than the original matrix dimensions.</p>

<p>This significantly reduces the number of trainable parameters and makes it possible to store separate lightweight adapters for different tasks or domains. The original LoRA study reported competitive performance while substantially reducing trainable parameter counts and memory requirements compared with full fine-tuning.</p>

<p>QLoRA</p>

<p>QLoRA combines quantization with LoRA-based fine-tuning.</p>

<p>The base model is stored in a low-precision format—four-bit quantization in the original QLoRA formulation—while gradients are propagated into trainable LoRA adapters. The base model remains frozen.</p>

<p>This approach dramatically reduces memory requirements. The original QLoRA research demonstrated fine-tuning of a 65-billion-parameter model on a single 48 GB GPU while preserving performance comparable to a full 16-bit fine-tuning baseline in its experiments.</p>

<p>LoRA and QLoRA do not replace pre-training. They adapt an already pre-trained model by modifying a much smaller set of trainable values.</p>

<p>Does GPT Actually Understand Language?</p>

<p>This question does not have a universally accepted yes-or-no answer because the word “understand” can refer to several different things.</p>

<p>At the mechanistic level, GPT processes numerical token representations and learns a probability distribution over possible continuations. It does not experience language in the same biological and social manner as a human being.</p>

<p>However, reducing the model to “autocomplete” can also be misleading. To predict language accurately across many contexts, the model develops internal representations that can support translation, summarization, classification, code generation, question answering, and forms of multi-step problem solving.</p>

<p>The original GPT research found that generative pre-training produced representations transferable to several natural-language understanding tasks. GPT-3 later demonstrated broad task behavior through prompting and in-context examples.</p>

<p>A careful description is therefore:</p>

<p>GPT learns complex statistical and representational structures from data, producing behavior that can resemble linguistic understanding, but fluent output alone does not prove human-like comprehension or factual reliability.</p>

<p>This distinction matters because a model may generate a confident, grammatically perfect, and entirely incorrect answer.</p>

<p>Why Does GPT Hallucinate?</p>

<p>A hallucination occurs when a model generates information that is false, unsupported, or inconsistent with the available evidence.</p>

<p>This behavior is connected to the model’s fundamental objective. A language model is trained to produce probable continuations, not to guarantee that every generated statement has been independently verified.</p>

<p>If the model has incomplete information, conflicting patterns, or insufficient context, it may still generate a plausible-looking answer instead of remaining silent. Modern post-training can reduce this behavior, but it cannot completely eliminate it.</p>

<p>Research examining language-model hallucinations argues that generative errors arise from statistical properties of pre-training and can persist through post-training because standard evaluation and optimization procedures may reward guessing rather than uncertainty.</p>

<p>For this reason, GPT outputs should be verified when used in:</p>

<p>Medical decisions<br>
Legal interpretation<br>
Financial analysis<br>
Academic research<br>
Security-sensitive software<br>
Current news and rapidly changing information</p>

<p>A language model can assist with these tasks, but linguistic confidence should never be treated as proof.</p>

<p>Context Windows and Temporary Information</p>

<p>GPT models operate on a limited sequence of tokens known as the context window.</p>

<p>The context may contain:</p>

<p>The user’s current message<br>
Earlier messages in the conversation<br>
System instructions<br>
Retrieved documents<br>
Tool outputs<br>
Generated tokens</p>

<p>The model conditions its next-token predictions on the information available within this context. Information outside the active context is not automatically available unless the surrounding system retrieves or stores it separately.</p>

<p>This is why application-level systems often combine language models with retrieval-augmented generation, databases, search engines, vector stores, and external tools. These components do not become part of the GPT model itself; they provide relevant information to the model at inference time.</p>

<p>GPT Is a Model, Not the Entire AI System</p>

<p>A modern AI application may contain far more than a language model.</p>

<p>A production system can include:</p>

<p>User interface<br>
    ↓<br>
Authentication and access control<br>
    ↓<br>
Prompt and context management<br>
    ↓<br>
Retrieval or web search<br>
    ↓<br>
GPT or another language model<br>
    ↓<br>
Tool execution<br>
    ↓<br>
Safety and validation layers<br>
    ↓<br>
Response presented to the user</p>

<p>The quality of an AI product therefore depends not only on its base model but also on its data pipeline, retrieval system, memory architecture, tool integration, evaluation process, and application design.</p>

<p>A powerful model placed inside a poorly designed system can still produce unreliable results. Conversely, a smaller model supported by high-quality retrieval, structured workflows, and careful validation can outperform a larger general-purpose model on a narrowly defined task.</p>

<p>Conclusion</p>

<p>GPT is a generative neural language model based on the Transformer architecture. It converts text into tokens, represents those tokens as vectors, processes them through stacked attention and feed-forward layers, and generates output through repeated next-token prediction.</p>

<p>Its capabilities emerge from several interconnected components:</p>

<p>Tokenization<br>
Transformer-based causal self-attention<br>
Large-scale pre-training<br>
Learned parameters<br>
Prompt-based in-context learning<br>
Supervised fine-tuning<br>
Preference optimization<br>
Efficient adaptation methods such as LoRA and QLoRA</p>

<p>The apparent simplicity of next-token prediction should not be confused with a simple system. When applied across sufficiently large and diverse datasets with substantial computational resources, this objective can produce models capable of performing a broad range of language and reasoning-related tasks.</p>

<p>At the same time, GPT remains a probabilistic model. It can generate inaccurate information, reproduce biases, misunderstand instructions, and express uncertainty poorly. Understanding both its architecture and its limitations is essential for using it responsibly.</p>

<p>GPT is not magic, and it is not merely a collection of prepared answers. It is a learned mathematical system that models patterns in sequences—and modern AI applications are built by combining that model with data, tools, infrastructure, and carefully designed human objectives.</p>

<p>Academic References</p>

<p>Brown, T. B., Mann, B., Ryder, N., et al. (2020). Language Models Are Few-Shot Learners. Advances in Neural Information Processing Systems, 33, 1877–1901.</p>

<p>Dettmers, T., Pagnoni, A., Holtzman, A., &amp; Zettlemoyer, L. (2023). QLoRA: Efficient Finetuning of Quantized LLMs. Advances in Neural Information Processing Systems, 36.</p>

<p>Hu, E. J., Shen, Y., Wallis, P., et al. (2021). LoRA: Low-Rank Adaptation of Large Language Models. International Conference on Learning Representations.</p>

<p>Kalai, A. T., Nachum, O., Vempala, S. S., &amp; Zhang, E. (2025). Why Language Models Hallucinate.</p>

<p>Kaplan, J., McCandlish, S., Henighan, T., et al. (2020). Scaling Laws for Neural Language Models.</p>

<p>Ouyang, L., Wu, J., Jiang, X., et al. (2022). Training Language Models to Follow Instructions with Human Feedback. Advances in Neural Information Processing Systems, 35, 27730–27744.</p>

<p>Radford, A., Narasimhan, K., Salimans, T., &amp; Sutskever, I. (2018). Improving Language Understanding by Generative Pre-Training. OpenAI.</p>

<p>Sennrich, R., Haddow, B., &amp; Birch, A. (2016). Neural Machine Translation of Rare Words with Subword Units. Proceedings of the 54th Annual Meeting of the Association for Computational Linguistics, 1715–1725.</p>

<p>Vaswani, A., Shazeer, N., Parmar, N., et al. (2017). Attention Is All You Need. Advances in Neural Information Processing Systems, 30.</p>

<p>Continue reading on DEVComunity:<br>
<a href="https://tsecurity.de/weiterlesen/3640965/3669106/what-is-gpt-a-practical-guide-to-tokens-transformers-training-and-fine-tuning/" target="_blank" rel="noopener noreferrer">https://dehayz.com/blog/gpt-nedir-nasil-calisir</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Day 2 – Collections & Data Transformation]]></title>
<description><![CDATA[1. The Big Four Collections 📚


Python has four primary built-in data collections. Choosing the right one depends entirely on your data structure requirements (e.g., whether order matters or if duplicates are allowed).




Collection
Ordered?
Mutable (Editable)?
Duplicates Allowed?
Syntax
Best Us...]]></description>
<link>https://tsecurity.de/de/3668634/sichere-programmierung/day-2-collections-data-transformation/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3668634/sichere-programmierung/day-2-collections-data-transformation/</guid>
<pubDate>Tue, 14 Jul 2026 18:23:24 +0200</pubDate>
<content:encoded><![CDATA[<h3>
  
  
  1. The Big Four Collections 📚
</h3>

<p>Python has four primary built-in data collections. Choosing the right one depends entirely on your data structure requirements (e.g., whether order matters or if duplicates are allowed).</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Collection</th>
<th>Ordered?</th>
<th>Mutable (Editable)?</th>
<th>Duplicates Allowed?</th>
<th>Syntax</th>
<th>Best Used For...</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>List</strong></td>
<td>✅ Yes</td>
<td>✅ Yes</td>
<td>✅ Yes</td>
<td><code>[]</code></td>
<td>Sequential data, logs, stacks of items.</td>
</tr>
<tr>
<td><strong>Tuple</strong></td>
<td>✅ Yes</td>
<td>❌ No</td>
<td>✅ Yes</td>
<td><code>()</code></td>
<td>Fixed structures, coordinate pairs, database rows.</td>
</tr>
<tr>
<td><strong>Set</strong></td>
<td>❌ No</td>
<td>✅ Yes</td>
<td>❌ No</td>
<td><code>{}</code></td>
<td>Eliminating duplicates, mathematical operations.</td>
</tr>
<tr>
<td><strong>Dictionary</strong></td>
<td>✅ Yes (3.7+)</td>
<td>✅ Yes</td>
<td>❌ No (Keys must be unique)</td>
<td><code>{"k": "v"}</code></td>
<td>Fast lookups, JSON data, structured records.</td>
</tr>
</tbody>
</table></div>

<h4>
  
  
  🌱 Easy Starter Example
</h4>



<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">my_list</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]</span>       <span class="c1"># Allows duplicates: [1, 2, 2, 3]
</span><span class="n">my_tuple</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">)</span>         <span class="c1"># Can't change it later!
</span><span class="n">my_set</span> <span class="o">=</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">}</span>         <span class="c1"># Drops duplicates automatically: {1, 2, 3}
</span><span class="n">my_dict</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">apple</span><span class="sh">"</span><span class="p">:</span> <span class="mi">5</span><span class="p">}</span>       <span class="c1"># Key-value lookup map
</span>
</code></pre>

</div>



<h4>
  
  
  Real-World Application Example 🛠️
</h4>



<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="c1"># List: Maintaining a sequence of logs
</span><span class="n">error_logs</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">404 Not Found</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">500 Internal Error</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">404 Not Found</span><span class="sh">"</span><span class="p">]</span>
<span class="n">error_logs</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="sh">"</span><span class="s">403 Forbidden</span><span class="sh">"</span><span class="p">)</span>  

<span class="c1"># Tuple: A strict 3D coordinate point 
</span><span class="n">point_3d</span> <span class="o">=</span> <span class="p">(</span><span class="mf">12.5</span><span class="p">,</span> <span class="mf">45.0</span><span class="p">,</span> <span class="o">-</span><span class="mf">3.1</span><span class="p">)</span>

<span class="c1"># Set: Stripping out duplicates instantly
</span><span class="n">unique_errors</span> <span class="o">=</span> <span class="nf">set</span><span class="p">(</span><span class="n">error_logs</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">unique_errors</span><span class="p">)</span>  <span class="c1"># Output: {'500 Internal Error', '403 Forbidden', '404 Not Found'}
</span>
<span class="c1"># Dictionary: Mapping a user record
</span><span class="n">user_profile</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">username</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">coder_99</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">role</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Admin</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">verified</span><span class="sh">"</span><span class="p">:</span> <span class="bp">True</span><span class="p">}</span>

</code></pre>

</div>






<h3>
  
  
  2. Powerful Iteration Helpers ⚙️
</h3>

<p>When transforming data, looping with a basic index counter is an anti-pattern. Instead, Python offers three foundational functions to loop like a pro.</p>

<h4>
  
  
  🔢 <code>enumerate()</code>
</h4>

<p>Tracks both the index and the item value simultaneously while looping through a sequence.</p>

<ul>
<li>
<strong>🌱 Easy Starter Example:</strong>
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">letter</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">([</span><span class="sh">"</span><span class="s">a</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">b</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">c</span><span class="sh">"</span><span class="p">]):</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">index</span><span class="p">,</span> <span class="n">letter</span><span class="p">)</span>  <span class="c1"># Output: 0 a, 1 b, 2 c
</span>
</code></pre>

</div>



<ul>
<li>
<strong>Real-World Application:</strong>
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">tasks</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">Download data</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Clean missing values</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Train model</span><span class="sh">"</span><span class="p">]</span>
<span class="k">for</span> <span class="n">index</span><span class="p">,</span> <span class="n">task</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">tasks</span><span class="p">,</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span><span class="p">):</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Step </span><span class="si">{</span><span class="n">index</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="n">task</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

</code></pre>

</div>



<h4>
  
  
  🤐 <code>zip()</code>
</h4>

<p>Pairs up elements from multiple lists or tuples into matched pairs. It stops as soon as the shortest list runs out.</p>

<ul>
<li>
<strong>🌱 Easy Starter Example:</strong>
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="nf">list</span><span class="p">(</span><span class="nf">zip</span><span class="p">([</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">],</span> <span class="p">[</span><span class="sh">"</span><span class="s">apple</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">banana</span><span class="sh">"</span><span class="p">])))</span> 
<span class="c1"># Output: [(1, 'apple'), (2, 'banana')]
</span>
</code></pre>

</div>



<ul>
<li>
<strong>Real-World Application:</strong>
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">names</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">Alice</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Bob</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Charlie</span><span class="sh">"</span><span class="p">]</span>
<span class="n">scores</span> <span class="o">=</span> <span class="p">[</span><span class="mi">85</span><span class="p">,</span> <span class="mi">92</span><span class="p">,</span> <span class="mi">78</span><span class="p">]</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">score</span> <span class="ow">in</span> <span class="nf">zip</span><span class="p">(</span><span class="n">names</span><span class="p">,</span> <span class="n">scores</span><span class="p">):</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s"> scored </span><span class="si">{</span><span class="n">score</span><span class="si">}</span><span class="s">%</span><span class="sh">"</span><span class="p">)</span>

</code></pre>

</div>



<h4>
  
  
  📐 <code>sorted()</code>
</h4>

<p>Returns a <em>new</em> sorted list from any iterable without modifying the original data structure.</p>

<ul>
<li>
<strong>🌱 Easy Starter Example:</strong>
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nf">print</span><span class="p">(</span><span class="nf">sorted</span><span class="p">([</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">]))</span>  <span class="c1"># Output: [1, 2, 3]
</span>
</code></pre>

</div>



<ul>
<li>
<strong>Real-World Application:</strong>
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">temperatures</span> <span class="o">=</span> <span class="p">[</span><span class="mi">32</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">45</span><span class="p">,</span> <span class="mi">22</span><span class="p">]</span>
<span class="n">descending_temps</span> <span class="o">=</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">temperatures</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>  <span class="c1"># [45, 32, 22, 12]
</span>
</code></pre>

</div>






<h3>
  
  
  3. Lambda Functions (Anonymous Functions) ⚡
</h3>

<p>A <code>lambda</code> function is a small, one-line anonymous function defined without the standard <code>def</code> keyword. They are ideal for quick, throwaway sorting or mapping operations.</p>

<blockquote>
<p><strong>Syntax:</strong> <code>lambda arguments: expression</code></p>
</blockquote>

<h4>
  
  
  🌱 Easy Starter Example
</h4>



<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="c1"># A simple function that doubles a number
</span><span class="n">double</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">*</span> <span class="mi">2</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">double</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>  <span class="c1"># Output: 10
</span>
</code></pre>

</div>



<h4>
  
  
  Real-World Application Example: Sorting Complex Structures 🔍
</h4>



<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">products</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Laptop</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">price</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1200</span><span class="p">},</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Mouse</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">price</span><span class="sh">"</span><span class="p">:</span> <span class="mi">25</span><span class="p">},</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Monitor</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">price</span><span class="sh">"</span><span class="p">:</span> <span class="mi">300</span><span class="p">}</span>
<span class="p">]</span>

<span class="c1"># Sort the products list by price using a lambda function as the sorting key
</span><span class="n">sorted_by_price</span> <span class="o">=</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">products</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">item</span><span class="p">:</span> <span class="n">item</span><span class="p">[</span><span class="sh">"</span><span class="s">price</span><span class="sh">"</span><span class="p">])</span>
<span class="nf">print</span><span class="p">(</span><span class="n">sorted_by_price</span><span class="p">)</span>
<span class="c1"># Output: [{'name': 'Mouse', 'price': 25}, {'name': 'Monitor', 'price': 300}, ...]
</span>
</code></pre>

</div>






<h3>
  
  
  4. Comprehensions (Data Transformation Engines) 🏎️
</h3>

<p>Comprehensions provide a concise, readable syntax to create a new collection based on an existing collection, effectively replacing bulky <code>for</code> loops.</p>

<h4>
  
  
  🧺 List Comprehension
</h4>

<ul>
<li>
<strong>🌱 Easy Starter Example:</strong>
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="c1"># Double every number in a list
</span><span class="n">doubled</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="o">*</span> <span class="mi">2</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]]</span>  <span class="c1"># Output: [2, 4, 6]
</span>
</code></pre>

</div>



<ul>
<li>
<strong>Real-World Application:</strong>
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">prices_usd</span> <span class="o">=</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">50</span><span class="p">]</span>
<span class="n">prices_eur</span> <span class="o">=</span> <span class="p">[</span><span class="n">price</span> <span class="o">*</span> <span class="mf">0.92</span> <span class="k">for</span> <span class="n">price</span> <span class="ow">in</span> <span class="n">prices_usd</span><span class="p">]</span> <span class="c1"># [9.2, 23.0, 46.0]
</span>
<span class="c1"># With a condition filter (Only keep items over $20)
</span><span class="n">expensive_items</span> <span class="o">=</span> <span class="p">[</span><span class="n">price</span> <span class="k">for</span> <span class="n">price</span> <span class="ow">in</span> <span class="n">prices_usd</span> <span class="k">if</span> <span class="n">price</span> <span class="o">&gt;=</span> <span class="mi">25</span><span class="p">]</span> <span class="c1"># [25, 50]
</span>
</code></pre>

</div>



<h4>
  
  
  🗺️ Dictionary &amp; Set Comprehensions
</h4>

<ul>
<li>
<strong>🌱 Easy Starter Example:</strong>
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="c1"># Create a quick number-to-square map
</span><span class="n">squares</span> <span class="o">=</span> <span class="p">{</span><span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="o">*</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">]}</span>  <span class="c1"># Output: {1: 1, 2: 4, 3: 9}
</span>
</code></pre>

</div>



<ul>
<li>
<strong>Real-World Application:</strong>
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="c1"># Set Comprehension: Extract unique file extensions, converted to lowercase
</span><span class="n">raw_files</span> <span class="o">=</span> <span class="p">[</span><span class="sh">"</span><span class="s">Data.CSV</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">script.py</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">readme.md</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Archive.csv</span><span class="sh">"</span><span class="p">]</span>
<span class="n">unique_extensions</span> <span class="o">=</span> <span class="p">{</span><span class="nb">file</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">"</span><span class="s">.</span><span class="sh">"</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="nf">lower</span><span class="p">()</span> <span class="k">for</span> <span class="nb">file</span> <span class="ow">in</span> <span class="n">raw_files</span><span class="p">}</span>
<span class="nf">print</span><span class="p">(</span><span class="n">unique_extensions</span><span class="p">)</span> <span class="c1"># Output: {'csv', 'py', 'md'}
</span>
</code></pre>

</div>






<h3>
  
  
  5. Practice Challenge: Processing &amp; Transforming Structured Data 🏋️
</h3>

<p>Let's tie Day 2 together! Imagine you receive a messy API payload of users. Your task is to filter out inactive users, format their names, and map their IDs to their profile details.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="c1"># Raw structured input data
</span><span class="n">raw_users</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">:</span> <span class="mi">101</span><span class="p">,</span> <span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">alice smith</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">is_active</span><span class="sh">"</span><span class="p">:</span> <span class="bp">True</span><span class="p">},</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">:</span> <span class="mi">102</span><span class="p">,</span> <span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">BOB JOHNSON</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">is_active</span><span class="sh">"</span><span class="p">:</span> <span class="bp">False</span><span class="p">},</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">:</span> <span class="mi">103</span><span class="p">,</span> <span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">charlie brown</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">is_active</span><span class="sh">"</span><span class="p">:</span> <span class="bp">True</span><span class="p">},</span>
<span class="p">]</span>

<span class="c1"># 1. Use list comprehension to filter out inactive users and format names cleanly
</span><span class="n">active_users</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">:</span> <span class="n">user</span><span class="p">[</span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">],</span> <span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">:</span> <span class="n">user</span><span class="p">[</span><span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">].</span><span class="nf">title</span><span class="p">()}</span> 
    <span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">raw_users</span> <span class="k">if</span> <span class="n">user</span><span class="p">[</span><span class="sh">"</span><span class="s">is_active</span><span class="sh">"</span><span class="p">]</span>
<span class="p">]</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Active Users:</span><span class="sh">"</span><span class="p">,</span> <span class="n">active_users</span><span class="p">)</span>
<span class="c1"># Output: [{'id': 101, 'name': 'Alice Smith'}, {'id': 103, 'name': 'Charlie Brown'}]
</span>
<span class="c1"># 2. Use dictionary comprehension to build a fast ID lookup database
</span><span class="n">user_database</span> <span class="o">=</span> <span class="p">{</span><span class="n">user</span><span class="p">[</span><span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">]:</span> <span class="n">user</span><span class="p">[</span><span class="sh">"</span><span class="s">name</span><span class="sh">"</span><span class="p">]</span> <span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">active_users</span><span class="p">}</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">User Database Map:</span><span class="sh">"</span><span class="p">,</span> <span class="n">user_database</span><span class="p">)</span>
<span class="c1"># Output: {101: 'Alice Smith', 103: 'Charlie Brown'}
</span>
</code></pre>

</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Build a Harmonic DJ Set Planner in 50 Lines]]></title>
<description><![CDATA[When Spotify deprecated audio_features and audio_analysis, the obvious loss was the per-track numbers — tempo, key, energy. The quieter loss was everything you used to build on top of them: the "what should I play next" logic, the harmonic-compatibility checks, the auto-ordered playlist. Plenty o...]]></description>
<link>https://tsecurity.de/de/3668171/sichere-programmierung/build-a-harmonic-dj-set-planner-in-50-lines/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3668171/sichere-programmierung/build-a-harmonic-dj-set-planner-in-50-lines/</guid>
<pubDate>Tue, 14 Jul 2026 15:56:30 +0200</pubDate>
<content:encoded><![CDATA[<p>When Spotify deprecated <code>audio_features</code> and <code>audio_analysis</code>, the obvious loss was the per-track numbers — tempo, key, energy. The quieter loss was everything you used to <em>build</em> on top of them: the "what should I play next" logic, the harmonic-compatibility checks, the auto-ordered playlist. Plenty of people have written a host-swap guide to get the raw fields back. This post is about the layer above that — turning a crate of track names into an actual, beat-matched, key-compatible set.</p>

<p>We'll do it in about 50 lines of Python against the FreqBlog Music API, using four endpoints: <code>/next-track</code> (what mixes well after this?), <code>/transition</code> (how well do these two mix, exactly?), <code>/setlist</code> (order this whole crate into an energy arc), and <code>/export/rekordbox</code> (drop the result straight into Rekordbox or Serato). No audio files, no Spotify ID — you pass track names or catalog IDs.</p>

<blockquote>
<p><strong>New here?</strong> If you haven't migrated off Spotify's removed endpoints yet, start with <a href="https://tsecurity.de/weiterlesen/3640030/3668171/build-a-harmonic-dj-set-planner-in-50-lines/" target="_blank" rel="noopener noreferrer">Spotify Audio Features Is Dead. Here's What to Use Instead in 2026</a> for the landscape and the host swap, then <a href="https://tsecurity.de/weiterlesen/3640030/3668171/build-a-harmonic-dj-set-planner-in-50-lines/" target="_blank" rel="noopener noreferrer">the field-by-field threshold guide</a> to re-tune your numbers. This post assumes you can already get a track's key and BPM and want to build set logic on top.</p>
</blockquote>

<h2>
  
  
  The idea: score the transition, not just the track
</h2>

<p>Every competing API that survived the Spotify shutdown gives you raw key and BPM and stops there. The interesting part of DJing isn't the value of one track — it's the relationship between two adjacent tracks: are the keys harmonically compatible on the <a href="https://tsecurity.de/weiterlesen/3640030/3668171/build-a-harmonic-dj-set-planner-in-50-lines/" target="_blank" rel="noopener noreferrer">Camelot wheel</a>, are the tempos close (or a clean half/double-time match), and is the energy moving the way you want the room to move?</p>

<p>FreqBlog exposes that relationship directly. <code>GET /transition</code> takes two catalog tracks and returns a 0–100 score with the breakdown:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight http"><code><span class="err">GET /transition?from_track_id=apple_ad1829eeccb70f9a&amp;to_track_id=1443810719
X-Api-Key: sk_live_...

{
  "from_track": { "track_name": "Can't Stop Lovin' You",    "camelot": "11B", "bpm": 117.8, ... },
  "to_track":   { "track_name": "You Beat Me to the Punch", "camelot": "11B", "bpm": 117.5, ... },
  "score": 99,
  "components": { "harmonic": 100, "tempo": 98, "energy": 100 },
  "detail": {
    "key_relation": "same",
    "from_camelot": "11B", "to_camelot": "11B",
    "from_bpm": 117.77, "to_bpm": 117.48,
    "bpm_delta": -0.29, "bpm_octave_matched": false,
    "from_energy": 0.69, "to_energy": 0.81, "energy_delta": 0.12
  },
  "reason": "11B-&gt;11B same key, 118-&gt;117 BPM (-0.29), energy +0.12"
}
</span></code></pre>

</div>



<p>The <code>score</code> blends three components: harmonic compatibility (Camelot-wheel relationship — same key, relative major/minor, adjacent ±1, energy boost/drop), tempo proximity (octave-aware, so a 70→140 BPM half-time blend counts as a match), and energy smoothness. The <code>reason</code> string is human copy you can drop straight into a UI.</p>

<h2>
  
  
  Step 1 — resolve your crate to catalog IDs
</h2>

<p>The set-builder endpoints work on catalog <code>itunes_track_id</code> values (e.g. <code>apple_ad1829eeccb70f9a</code>). You get those from any <code>/lookup</code> or <code>/search</code> response — so a crate of plain track names becomes a list of IDs with one lookup each:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="kn">import</span> <span class="n">requests</span>

<span class="n">API</span> <span class="o">=</span> <span class="sh">"</span><span class="s">https://api.freqblog.com</span><span class="sh">"</span>
<span class="n">HEADERS</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">X-Api-Key</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">sk_live_your_key_here</span><span class="sh">"</span><span class="p">}</span>

<span class="k">def</span> <span class="nf">resolve</span><span class="p">(</span><span class="n">track</span><span class="p">,</span> <span class="n">artist</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Track name + artist -&gt; catalog itunes_track_id (or None on a miss).</span><span class="sh">"""</span>
    <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">API</span><span class="si">}</span><span class="s">/lookup</span><span class="sh">"</span><span class="p">,</span>
                     <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="sh">"</span><span class="s">track</span><span class="sh">"</span><span class="p">:</span> <span class="n">track</span><span class="p">,</span> <span class="sh">"</span><span class="s">artist</span><span class="sh">"</span><span class="p">:</span> <span class="n">artist</span><span class="p">},</span>
                     <span class="n">headers</span><span class="o">=</span><span class="n">HEADERS</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">30</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">r</span><span class="p">.</span><span class="n">status_code</span> <span class="o">!=</span> <span class="mi">200</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">None</span>                      <span class="c1"># 202 = queued for ingest, try again shortly
</span>    <span class="k">return</span> <span class="n">r</span><span class="p">.</span><span class="nf">json</span><span class="p">().</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">itunes_track_id</span><span class="sh">"</span><span class="p">)</span>

<span class="n">crate</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Can</span><span class="sh">'</span><span class="s">t Stop Lovin</span><span class="sh">'"</span><span class="p">,</span> <span class="sh">"</span><span class="s">Tom Browne</span><span class="sh">"</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Got To Be Real</span><span class="sh">"</span><span class="p">,</span>    <span class="sh">"</span><span class="s">Cheryl Lynn</span><span class="sh">"</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Ain</span><span class="sh">'</span><span class="s">t Nobody</span><span class="sh">"</span><span class="p">,</span>      <span class="sh">"</span><span class="s">Chaka Khan</span><span class="sh">"</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Square Biz</span><span class="sh">"</span><span class="p">,</span>        <span class="sh">"</span><span class="s">Teena Marie</span><span class="sh">"</span><span class="p">),</span>
    <span class="p">(</span><span class="sh">"</span><span class="s">Forget Me Nots</span><span class="sh">"</span><span class="p">,</span>    <span class="sh">"</span><span class="s">Patrice Rushen</span><span class="sh">"</span><span class="p">),</span>
<span class="p">]</span>
<span class="n">ids</span> <span class="o">=</span> <span class="p">[</span><span class="n">tid</span> <span class="nf">for </span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">a</span><span class="p">)</span> <span class="ow">in</span> <span class="n">crate</span> <span class="nf">if </span><span class="p">(</span><span class="n">tid</span> <span class="p">:</span><span class="o">=</span> <span class="nf">resolve</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">a</span><span class="p">))]</span>
</code></pre>

</div>



<blockquote>
<p><strong>Note:</strong> A <code>/lookup</code> on a track that isn't analysed yet returns <code>202</code> and queues an on-demand ingest — it'll be ready in 30 s–2 min and resolve on a retry. For a planner, resolve your crate once and cache the IDs.</p>
</blockquote>

<h2>
  
  
  Step 2 — "what plays next?" with /next-track
</h2>

<p>Given any seed track, <code>GET /next-track</code> returns the seed's closest sonic neighbours re-ranked by transition score — each with the same <code>score</code>, <code>components</code>, and <code>reason</code> as <code>/transition</code>. This is your live "suggest the next tune" box:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="k">def</span> <span class="nf">suggest_next</span><span class="p">(</span><span class="n">seed_id</span><span class="p">,</span> <span class="n">n</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span> <span class="n">min_score</span><span class="o">=</span><span class="mi">85</span><span class="p">):</span>
    <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">API</span><span class="si">}</span><span class="s">/next-track</span><span class="sh">"</span><span class="p">,</span>
                     <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="sh">"</span><span class="s">seed_track_id</span><span class="sh">"</span><span class="p">:</span> <span class="n">seed_id</span><span class="p">,</span> <span class="sh">"</span><span class="s">n</span><span class="sh">"</span><span class="p">:</span> <span class="n">n</span><span class="p">,</span>
                             <span class="sh">"</span><span class="s">min_score</span><span class="sh">"</span><span class="p">:</span> <span class="n">min_score</span><span class="p">,</span>
                             <span class="sh">"</span><span class="s">exclude_same_artist</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">true</span><span class="sh">"</span><span class="p">},</span>
                     <span class="n">headers</span><span class="o">=</span><span class="n">HEADERS</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">30</span><span class="p">)</span>
    <span class="n">r</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
    <span class="k">return</span> <span class="n">r</span><span class="p">.</span><span class="nf">json</span><span class="p">()[</span><span class="sh">"</span><span class="s">suggestions</span><span class="sh">"</span><span class="p">]</span>

<span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="nf">suggest_next</span><span class="p">(</span><span class="n">ids</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">n</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
    <span class="n">t</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="sh">"</span><span class="s">track</span><span class="sh">"</span><span class="p">]</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">s</span><span class="p">[</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="p">]</span><span class="si">:</span><span class="o">&gt;</span><span class="mi">3</span><span class="si">}</span><span class="s">  </span><span class="si">{</span><span class="n">t</span><span class="p">[</span><span class="sh">'</span><span class="s">track_name</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s"> - </span><span class="si">{</span><span class="n">t</span><span class="p">[</span><span class="sh">'</span><span class="s">artist_name</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">  (</span><span class="si">{</span><span class="n">s</span><span class="p">[</span><span class="sh">'</span><span class="s">reason</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">)</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<p>For our seed — "Can't Stop Lovin'" at 11B / 118 BPM — the top picks come back same-key (11B) and within a beat or two of 118 BPM, scoring 98–99 with reasons like <code>"11B-&gt;11B same key, 118-&gt;117 BPM (-0.29), energy +0.12"</code>. The <code>bpm_drift</code> and <code>max_key_distance</code> query params let you widen or tighten the net.</p>

<h2>
  
  
  Step 3 — order the whole crate with /setlist
</h2>

<p>The payoff endpoint. <code>POST /setlist</code> takes your list of IDs and returns them <em>ordered</em> into an energy arc, keeping every consecutive transition harmonically and tempo-smooth. Pick the arc: <code>peak_time</code> (build to a peak, then ease), <code>warmup</code>, <code>cooldown</code>, or <code>flat</code>.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="k">def</span> <span class="nf">build_set</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">arc</span><span class="o">=</span><span class="sh">"</span><span class="s">peak_time</span><span class="sh">"</span><span class="p">,</span> <span class="n">start_id</span><span class="o">=</span><span class="bp">None</span><span class="p">):</span>
    <span class="n">body</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">track_ids</span><span class="sh">"</span><span class="p">:</span> <span class="n">ids</span><span class="p">,</span> <span class="sh">"</span><span class="s">arc</span><span class="sh">"</span><span class="p">:</span> <span class="n">arc</span><span class="p">}</span>
    <span class="k">if</span> <span class="n">start_id</span><span class="p">:</span>
        <span class="n">body</span><span class="p">[</span><span class="sh">"</span><span class="s">start_track_id</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">start_id</span>          <span class="c1"># optional fixed opener
</span>    <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">post</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">API</span><span class="si">}</span><span class="s">/setlist</span><span class="sh">"</span><span class="p">,</span> <span class="n">json</span><span class="o">=</span><span class="n">body</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="n">HEADERS</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">30</span><span class="p">)</span>
    <span class="n">r</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
    <span class="k">return</span> <span class="n">r</span><span class="p">.</span><span class="nf">json</span><span class="p">()</span>

<span class="n">plan</span> <span class="o">=</span> <span class="nf">build_set</span><span class="p">(</span><span class="n">ids</span><span class="p">,</span> <span class="n">arc</span><span class="o">=</span><span class="sh">"</span><span class="s">peak_time</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Flow score: </span><span class="si">{</span><span class="n">plan</span><span class="p">[</span><span class="sh">'</span><span class="s">flow_score</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">/100   (</span><span class="si">{</span><span class="n">plan</span><span class="p">[</span><span class="sh">'</span><span class="s">count</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s"> tracks, arc=</span><span class="si">{</span><span class="n">plan</span><span class="p">[</span><span class="sh">'</span><span class="s">arc</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">)</span><span class="sh">"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">t</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">plan</span><span class="p">[</span><span class="sh">"</span><span class="s">tracks</span><span class="sh">"</span><span class="p">]):</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">  </span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">:</span><span class="o">&gt;</span><span class="mi">2</span><span class="si">}</span><span class="s">. </span><span class="si">{</span><span class="n">t</span><span class="p">[</span><span class="sh">'</span><span class="s">track_name</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s"> - </span><span class="si">{</span><span class="n">t</span><span class="p">[</span><span class="sh">'</span><span class="s">artist_name</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
<span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="n">plan</span><span class="p">[</span><span class="sh">"</span><span class="s">transitions</span><span class="sh">"</span><span class="p">]:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">     </span><span class="si">{</span><span class="n">step</span><span class="p">[</span><span class="sh">'</span><span class="s">from_index</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">-&gt;</span><span class="si">{</span><span class="n">step</span><span class="p">[</span><span class="sh">'</span><span class="s">to_index</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="s">  </span><span class="si">{</span><span class="n">step</span><span class="p">[</span><span class="sh">'</span><span class="s">score</span><span class="sh">'</span><span class="p">]</span><span class="si">:</span><span class="o">&gt;</span><span class="mi">3</span><span class="si">}</span><span class="s">  </span><span class="si">{</span><span class="n">step</span><span class="p">[</span><span class="sh">'</span><span class="s">reason</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

<span class="n">ordered_ids</span> <span class="o">=</span> <span class="p">[</span><span class="n">t</span><span class="p">[</span><span class="sh">"</span><span class="s">itunes_track_id</span><span class="sh">"</span><span class="p">]</span> <span class="k">for</span> <span class="n">t</span> <span class="ow">in</span> <span class="n">plan</span><span class="p">[</span><span class="sh">"</span><span class="s">tracks</span><span class="sh">"</span><span class="p">]]</span>
</code></pre>

</div>



<p>You get back the tracks in play order, a per-step <code>transitions</code> list (each with its own score and reason), an overall <code>flow_score</code> (the mean of the step scores — how smooth the whole set is), and an <code>omitted</code> list of any IDs not in the catalog. That's a complete, defensible running order — not a shuffle.</p>

<h2>
  
  
  Step 4 — export to Rekordbox in one call
</h2>

<p>Take the ordered IDs from <code>/setlist</code> and hand them to <code>GET /export/rekordbox</code> to get a Pioneer-format XML you can import into Rekordbox or Serato:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="k">def</span> <span class="nf">export_rekordbox</span><span class="p">(</span><span class="n">ordered_ids</span><span class="p">,</span> <span class="n">path</span><span class="o">=</span><span class="sh">"</span><span class="s">my_set.xml</span><span class="sh">"</span><span class="p">):</span>
    <span class="n">r</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">API</span><span class="si">}</span><span class="s">/export/rekordbox</span><span class="sh">"</span><span class="p">,</span>
                     <span class="n">params</span><span class="o">=</span><span class="p">{</span><span class="sh">"</span><span class="s">track_ids</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">,</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">ordered_ids</span><span class="p">)},</span>
                     <span class="n">headers</span><span class="o">=</span><span class="n">HEADERS</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">30</span><span class="p">)</span>
    <span class="n">r</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
    <span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="n">path</span><span class="p">,</span> <span class="sh">"</span><span class="s">w</span><span class="sh">"</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="sh">"</span><span class="s">utf-8</span><span class="sh">"</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
        <span class="n">f</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="n">r</span><span class="p">.</span><span class="n">text</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Wrote </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s"> - import via Rekordbox &gt; File &gt; Import Collection</span><span class="sh">"</span><span class="p">)</span>

<span class="nf">export_rekordbox</span><span class="p">(</span><span class="n">ordered_ids</span><span class="p">)</span>
</code></pre>

</div>



<p>That's the whole planner: resolve → suggest → order → export. Counting the import, the helpers, and the crate, it lands right around 50 lines — and the part that used to be impossible without Spotify's data (or a pile of your own DSP) is now four HTTP calls.</p>

<h2>
  
  
  What each call costs
</h2>

<p>The set-builder endpoints run through the same monthly-quota model as <code>/lookup</code>, and you're only charged on a served <code>200</code> — a <code>404</code> (track not in catalog) or <code>422</code> (bad/missing params) costs nothing.</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Endpoint</th>
<th>Quota</th>
<th>Why</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>GET /transition</code></td>
<td>1 request</td>
<td>A single A→B comparison, same as a <code>/lookup</code>.</td>
</tr>
<tr>
<td><code>GET /next-track</code></td>
<td>3 requests</td>
<td>Scores up to ~1,000 candidate neighbours to rank the top N.</td>
</tr>
<tr>
<td><code>POST /setlist</code></td>
<td>5 requests</td>
<td>An N² scoring problem — the premium "order my whole crate" call.</td>
</tr>
</tbody>
</table></div>

<p>So a typical session — resolve a 12-track crate (12), order it once (<code>/setlist</code>, 5), then export (free) — is well under 20 quota requests. The free tier's 1,000/month covers a lot of set-building before you need a paid plan.</p>

<blockquote>
<p><strong>One honest note on scope.</strong> <code>/setlist</code> uses a greedy ordering with an energy-arc objective — it's built for clean, playable running orders, not a globally-optimal tour through your crate. For long sets, run it per-section (warmup / peak / cooldown crates) and stitch, or use <code>/next-track</code> interactively while you play. The <code>flow_score</code> tells you how smooth the result is so you can spot a weak link.</p>
</blockquote>

<h2>
  
  
  Why this works without Spotify
</h2>

<ul>
<li>
<strong>No audio upload.</strong> Everything is keyed by track name, ISRC, or catalog ID against a pre-analysed catalog — you never ship a file.</li>
<li>
<strong>No Spotify ID.</strong> The crate is plain names; <code>/lookup</code> resolves them and queues an on-demand analysis for anything not yet in the catalog.</li>
<li>
<strong>First-class harmonic data.</strong> Camelot and Open Key notation are returned directly, so the transition scoring has real harmonic relationships to work with — not just two raw key integers you have to compare yourself.</li>
<li>
<strong>The set logic is the product.</strong> Raw key/BPM is table stakes; the differentiator is scoring the <em>transition</em> and ordering the <em>set</em>. That's what these three endpoints sell.</li>
</ul>

<p><strong>Try FreqBlog — free tier, no card:</strong> <a href="https://tsecurity.de/weiterlesen/3640030/3668171/build-a-harmonic-dj-set-planner-in-50-lines/" target="_blank" rel="noopener noreferrer">https://freqblog.com/</a></p>

<h2>
  
  
  Further reading
</h2>

<ul>
<li>
<a href="https://tsecurity.de/weiterlesen/3640030/3668171/build-a-harmonic-dj-set-planner-in-50-lines/" target="_blank" rel="noopener noreferrer">Spotify Audio Features Is Dead. Here's What to Use Instead in 2026.</a> — the landscape and the host-swap walkthrough</li>
<li>
<a href="https://tsecurity.de/weiterlesen/3640030/3668171/build-a-harmonic-dj-set-planner-in-50-lines/" target="_blank" rel="noopener noreferrer">Migrating from Spotify Audio Features: a Field-by-Field Threshold Guide</a> — re-tune your numbers once the calls flow</li>
<li>
<a href="https://tsecurity.de/weiterlesen/3640030/3668171/build-a-harmonic-dj-set-planner-in-50-lines/" target="_blank" rel="noopener noreferrer">Camelot Wheel for Developers: Harmonic Mixing Without the Music Theory PhD</a> — the harmonic rules behind the transition score</li>
<li>
<a href="https://tsecurity.de/weiterlesen/3640030/3668171/build-a-harmonic-dj-set-planner-in-50-lines/" target="_blank" rel="noopener noreferrer">Half-Time vs Double-Time BPM Detection</a> — why the tempo score is octave-aware</li>
<li><a href="https://tsecurity.de/weiterlesen/3640030/3668171/build-a-harmonic-dj-set-planner-in-50-lines/" target="_blank" rel="noopener noreferrer">Why DJ Platforms Disagree on Key 60% of the Time</a></li>
</ul>




<p><em>Originally published at <a href="https://tsecurity.de/weiterlesen/3640030/3668171/build-a-harmonic-dj-set-planner-in-50-lines/" target="_blank" rel="noopener noreferrer">freqblog.com</a>.</em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Reconstructing Pelé’s lost goal]]></title>
<description><![CDATA[Author: Google DeepMind - Bewertung: 17x - Views:147 On August 2, 1959, Pelé scored the most beautiful goal of his career: three consecutive “sombreros” without the ball touching the ground. Yet, the legendary ‘Gol da Rua Javari’ was never caught on film. We worked alongside historians, sports jo...]]></description>
<link>https://tsecurity.de/de/3668042/ki-ai-videos/reconstructing-pels-lost-goal/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3668042/ki-ai-videos/reconstructing-pels-lost-goal/</guid>
<pubDate>Tue, 14 Jul 2026 15:15:17 +0200</pubDate>
<content:encoded><![CDATA[<p>Author: Google DeepMind - Bewertung: 17x - Views:147 <br/></p><p><iframe id="ytplayer" loading="lazy" type="text/html" width="100%" height="auto" src="https://www.youtube.com/embed/R-Yqes8AotY?autoplay=1&origin=http://tsecurity.de" frameborder="0"></iframe></p><p>On August 2, 1959, Pelé scored the most beautiful goal of his career: three consecutive “sombreros” without the ball touching the ground. Yet, the legendary ‘Gol da Rua Javari’ was never caught on film. We worked alongside historians, sports journalists, football legends, and Pelé’s family to reconstruct this lost moment and share it with the world. <br />
<br />
This project was created in full partnership with the Pelé Brand, the official managers of the Pelé estate.<br />
<br />
Rooted in education and cultural preservation, the project heads to the Pelé Museum this year. To achieve this, teams from Google DeepMind used models like Gemini Omni and Veo to transform historical fragments into moving imagery, filmed on the original pitch with authentic uniforms and a vintage ball.<br />
<br />
By making the memory of this goal more accessible, it stands as a tribute to inspire a new generation of fans during the first World Cup without him.<br />
<br />
The goal is on display at the Museu Pelé in Santos, Brazil.<br />
<br />
Learn more at https://blog.google/innovation-and-ai/models-and-research/google-deepmind/pele-lost-goal-reconstructed<br />
<br />
___<br />
<br />
Special thanks to:<br />
<br />
Flávia Kurtz, Walter Dias, Pepe, Neymar Jr., Marta, Mauro Beting, Vicente Romano Netto, Angelo Agarelli, Anita Lucchesi, Paulo Monteiro, Santos F.C., C.A. Juventus, NY Cosmos, Museu Pelé, Museu do Futebol<br />
<br />
Research: Arka<br />
Lead Researcher, Historian: Anita Lucchesi<br />
<br />
Production: The Youth<br />
Directors: Youth + Yuca<br />
<br />
NY & SF Production: Feast<br />
AI Production: Special Guest X<br />
<br />
Editor: Bruno Lasevicius<br />
Post Production: Colossal<br />
<br />
Post Music and Sound: Satelite<br />
<br />
Music: <br />
“Magalenha”<br />
Performed by Sérgio Mendes<br />
Written by Carlinhos Brown<br />
Courtesy of Warner-Tamerlane Publishing Corp. (BMI) c/o Warner Chappell Music, Inc.<br />
and Concord Records, a Concord Label Group Release<br />
<br />
“Paraquedas”<br />
Written by Russo Passapusso<br />
Universal Mus. Publishing MGB Brasil Ltda. obo Máquina de Louco Ed. Mus. Ltda.<br />
<br />
___<br />
<br />
Subscribe to our channel https://www.youtube.com/@googledeepmind <br />
Find us on X https://x.com/GoogleDeepMind<br />
Follow us on Instagram https://instagram.com/googledeepmind <br />
Add us on Linkedin https://www.linkedin.com/company/deepmind/<br/></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Silo Season 3’s Two Timelines Explained: How the Past Changes Everything]]></title>
<description><![CDATA[Silo Season 3 follows two timelines separated by more than three centuries, with Juliette Nichols fighting for the truth inside Silo 18 while new characters reveal how the underground world began.




Release date: July 3, 2026



Streaming platform: Apple TV



Episodes: 10



Release schedule: ...]]></description>
<link>https://tsecurity.de/de/3667780/apple-ios-macos/silo-season-3s-two-timelines-explained-how-the-past-changes-everything/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3667780/apple-ios-macos/silo-season-3s-two-timelines-explained-how-the-past-changes-everything/</guid>
<pubDate>Tue, 14 Jul 2026 13:39:08 +0200</pubDate>
<content:encoded><![CDATA[Silo Season 3 follows two timelines separated by more than three centuries, with Juliette Nichols fighting for the truth inside Silo 18 while new characters reveal how the underground world began.




Release date: July 3, 2026



Streaming platform: Apple TV



Episodes: 10



Release schedule: New episode every Friday



Season finale: September 4, 2026



Genre: Science fiction, dystopian drama and political thriller



Based on: Hugh Howey’s Silo novel trilogy



Main cast: Rebecca Ferguson, Common, Tim Robbins, Chinaza Uche and Alexandria Riley



New cast: Ashley Zukerman, Jessica Henwick, Jessica Brown Findlay, Morven Christie, Laura Innes, Reed Birney, Matt Craven and Colin Hanks




Apple has confirmed that Season 3 continues the present-day crisis inside Silo 18 while introducing an origin story set centuries earlier. The two stories initially appear separate, but both explore memory loss, political control and the decisions that eventually forced humanity underground.



Spoilers Ahead for Silo Season 3



The present-day timeline begins after Juliette returns to Silo 18 and prevents its residents from walking outside. Her survival should make her the most trusted person in the silo, but she wakes with major gaps in her memory.



Juliette can no longer clearly remember Bernard, the rebellion or the events that brought her home. Robert Sims and Camille use her condition to influence what she believes, while medication appears to weaken her remaining memories. Even so, brief images from her past suggest that the truth has not disappeared completely.



The Present Timeline Follows Juliette in Silo 18



The first timeline takes place roughly 352 years after the event that destroyed the outside world. Juliette now holds an important position inside Silo 18, but her memory loss leaves her vulnerable to the people controlling information.



Her storyline also reveals a larger plan involving memory manipulation. The Algorithm appears prepared to erase memories across multiple silos through drugs placed in their water supply.



This explains why earlier generations forgot rebellions, historical records and details about the outside world. Juliette’s resistance to the treatment could help her uncover how the silos have controlled their populations for centuries.



The Before Times Reveal How the Crisis Started



The second timeline takes viewers back to Washington, D.C., before the silos became humanity’s permanent home.



Congressman Daniel Keene becomes involved in a political conspiracy connected to an alleged Iranian attack on American soil. His sister Charlotte, a fighter pilot, returns from a secret mission involving a strange substance and begins experiencing memory problems.



Their story turns the series into a political thriller as government officials, military operations and secret experiments move closer to the event that ended normal life on the surface. Showrunner Graham Yost said this section draws inspiration from paranoid thrillers of the 1970s.



How the Two Silo Season 3 Timelines Connect



Memory loss provides the clearest connection between the timelines.



Charlotte experiences missing memories in the Before Times, while Juliette faces similar problems centuries later. This suggests that the technology used to control people inside the silos existed before the underground communities were created.



Daniel and Charlotte’s investigation should eventually explain who designed the silos, why people entered them and how the Algorithm gained control. Meanwhile, Juliette’s story shows the long-term consequences of those decisions.



The timelines are moving toward the same central answer: someone planned the silo system before the world ended, and memory manipulation helped keep that system alive for more than 300 years.



Silo Season 3 releases new episodes every Friday on Apple TV through September 4. What do you think connects Juliette, Charlotte and the creation of the silos? Let us know in the comments.]]></content:encoded>
</item>
<item>
<title><![CDATA[7 MongoDB Query Mistakes That Return the Wrong Results]]></title>
<description><![CDATA[MongoDB queries look simple. You type a field, give it a value, hit run, and you get your data back.

But just because a query runs without throwing an error doesn't mean it worked right. Sometimes you get a blank screen. Sometimes you get way too many records. Other times, the data looks fine at...]]></description>
<link>https://tsecurity.de/de/3667509/sichere-programmierung/7-mongodb-query-mistakes-that-return-the-wrong-results/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3667509/sichere-programmierung/7-mongodb-query-mistakes-that-return-the-wrong-results/</guid>
<pubDate>Tue, 14 Jul 2026 11:59:20 +0200</pubDate>
<content:encoded><![CDATA[<p>MongoDB queries look simple. You type a field, give it a value, hit run, and you get your data back.</p>

<p>But just because a query runs without throwing an error doesn't mean it worked right. Sometimes you get a blank screen. Sometimes you get way too many records. Other times, the data looks fine at first glance, but it doesn't actually match what you asked for.</p>

<p>Most of these slip-ups happen for one basic reason: the query structure doesn't match the way the data actually sits in the database.</p>

<p>To show you what we mean, we’ll use a clinic database with a collection called <code>visits</code>. Here is what a typical document looks like:</p>

<p>JSON<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>{
  "_id": "6871b6f9c3f1d1a4c2a10001",
  "status": "completed",
  "visitDate": "2026-07-01T09:30:00.000Z",
  "patient": { "name": "Anna Keller", "age": 34 },
  "doctor": { "name": "Dr. James Carter", "specialty": "Cardiology" },
  "symptoms": ["cough", "fever"],
  "prescriptions": [
    { "name": "Ibuprofen", "active": false },
    { "name": "Paracetamol", "active": true }
  ],
  "invoice": { "paid": true, "method": "card", "total": 250 }
}
</code></pre>

</div>



<p>You can run these examples right in the <a href="https://tsecurity.de/weiterlesen/3639368/3667509/7-mongodb-query-mistakes-that-return-the-wrong-results/" target="_blank" rel="noopener noreferrer">VisuaLeaf MongoDB Shell</a>. Using visual tools makes a big difference because you can see exactly what MongoDB is returning in real time.</p>

<h2>
  
  
  1. Forgetting the Curly Braces
</h2>

<p>This is just a quick typo, but it breaks things right away.</p>

<p><strong>The Mistake:</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">db</span><span class="p">.</span><span class="nx">visits</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="nx">status</span><span class="p">:</span> <span class="dl">"</span><span class="s2">completed</span><span class="dl">"</span><span class="p">)</span>
</code></pre>

</div>



<p><strong>The Correct Query</strong></p>

<p><a href="https://tsecurity.de/weiterlesen/3639368/3667509/7-mongodb-query-mistakes-that-return-the-wrong-results/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiu7e84hx4awafe8ue9eq.png" alt="MongoDB query examples showing common mistakes with $or, $in, arrays, dates, and text search in VisuaLeaf." width="800" height="545"></a></p>

<p>The <code>find()</code> tool always expects an object. Even if you are only looking for one specific thing, you still need to wrap that condition in curly braces <code>{}</code>.</p>

<h2>
  
  
  2. Treating <code>$or</code> Like a Regular Object
</h2>

<p>This one trips a lot of people up because the broken version looks like it should work.</p>

<p><strong>The Mistake:</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>db.visits.find({
  $or: {
    status: "completed",
    "invoice.paid": false
  }
})
</code></pre>

</div>



<p>What is wrong:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>$or expects an array of conditions, but this query gives it one object.
</code></pre>

</div>



<p>The error will usually be something like:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>MongoServerError: $or must be an array
</code></pre>

</div>



<p><strong>The Correct Query</strong></p>

<p><a href="https://tsecurity.de/weiterlesen/3639368/3667509/7-mongodb-query-mistakes-that-return-the-wrong-results/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F42cfbhf55y928ge2j9yg.png" alt="MongoDB Shell query using $or with separate conditions, showing matching visit records in VisuaLeaf Table View." width="800" height="545"></a></p>

<p>The first query is wrong because <code>$or</code> needs an array, not one regular object.</p>

<p>Each condition has to be written as its own object inside <code>[]</code>.</p>

<p>The corrected query returns visits where the status is <code>pending</code> or <code>completed</code>.</p>

<h2>
  
  
  3. Querying Nested Fields Like They Are Flat
</h2>

<p>MongoDB documents often have fields inside other fields.</p>

<p>In our <code>visits</code> collection, <code>doctor</code> is an object:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">doctor</span><span class="p">:</span> <span class="p">{</span>
  <span class="nl">name</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Dr. Michael Brown</span><span class="dl">"</span><span class="p">,</span>
  <span class="nx">specialization</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Neurology</span><span class="dl">"</span>
<span class="p">}</span>
</code></pre>

</div>



<p><strong>Query to avoid:</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">db</span><span class="p">.</span><span class="nx">visits</span><span class="p">.</span><span class="nf">find</span><span class="p">({</span>
  <span class="na">doctor</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Neurology</span><span class="dl">"</span>
<span class="p">})</span>
</code></pre>

</div>



<p>This asks MongoDB to find a <code>doctor</code> field that is exactly <code>"Neurology"</code>.</p>

<p>But <code>doctor</code> is not a string. It is an object.</p>

<p><strong>Better query:</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">db</span><span class="p">.</span><span class="nx">visits</span><span class="p">.</span><span class="nf">find</span><span class="p">({</span>
  <span class="dl">"</span><span class="s2">doctor.specialization</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Neurology</span><span class="dl">"</span>
<span class="p">})</span>
</code></pre>

</div>



<p><a href="https://tsecurity.de/weiterlesen/3639368/3667509/7-mongodb-query-mistakes-that-return-the-wrong-results/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhs6po958xjoqt0qxj5dy.png" alt="MongoDB query for a nested doctor.specialization field shown in VisuaLeaf Tree View." width="799" height="615"></a></p>

<p>The dot tells MongoDB to go inside the <code>doctor</code> object and check the <code>specialization</code> field.</p>

<p>So instead of asking:</p>

<blockquote>
<p>Is the whole <code>doctor</code> field equal to Neurology?</p>
</blockquote>

<p>you are asking:</p>

<blockquote>
<p>Is the doctor’s specialization Neurology?</p>
</blockquote>

<h2>
  
  
  4. Typing the Same Field Twice
</h2>

<p>Say you want to find visits with doctors from Cardiology or Dermatology.</p>

<p><strong>Query to avoid:</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">db</span><span class="p">.</span><span class="nx">visits</span><span class="p">.</span><span class="nf">find</span><span class="p">({</span>
  <span class="dl">"</span><span class="s2">doctor.specialization</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Cardiology</span><span class="dl">"</span><span class="p">,</span>
  <span class="dl">"</span><span class="s2">doctor.specialization</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Dermatology</span><span class="dl">"</span>
<span class="p">})</span>
</code></pre>

</div>



<p><strong>Better query:</strong></p>

<p><a href="https://tsecurity.de/weiterlesen/3639368/3667509/7-mongodb-query-mistakes-that-return-the-wrong-results/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvo1fjvgc4mtvbocfj91y.png" alt="MongoDB Shell query using $in to search visits by multiple values in the same field, with results shown in VisuaLeaf Table View." width="800" height="545"></a></p>

<p>In JavaScript and MongoDB, you should not reuse the same key within a single object.</p>

<p>If you type <code>"doctor.specialization"</code> twice, the second value can overwrite the first one. So MongoDB may only search for <code>Dermatology</code>.</p>

<p>If one field can match more than one value, use <code>$in</code>.</p>

<h2>
  
  
  5. Treating Dates Like Plain Text
</h2>

<p>Dates can look like regular text, but in MongoDB they are often stored as real Date values.</p>

<p>In our <code>visits</code> collection, the invoice date is stored inside the <code>invoice</code> object:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">invoice</span><span class="p">:</span> <span class="p">{</span>
  <span class="nl">issuedAt</span><span class="p">:</span> <span class="nc">ISODate</span><span class="p">(</span><span class="dl">"</span><span class="s2">2026-05-18T10:15:00Z</span><span class="dl">"</span><span class="p">)</span>
<span class="p">}</span>

</code></pre>

</div>



<p><strong>So this query will not work as expected:</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>db.visits.find({
  "invoice.issuedAt": "2026-05-18"
})
</code></pre>

</div>



<p>This searches for a string, not a Date, so it will usually return nothing.</p>

<p><strong>Better query:</strong></p>

<p><a href="https://tsecurity.de/weiterlesen/3639368/3667509/7-mongodb-query-mistakes-that-return-the-wrong-results/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faeb7guvs2u7ncb45nrsn.png" alt="MongoDB Shell query in VisuaLeaf using $gte and $lt with new Date() to find invoices issued on May 18, 2026, with the matching result shown in Table View." width="799" height="564"></a></p>

<p>This returns invoices created on May 18, 2026.</p>

<p>The range matters because dates usually include time. A visit at <code>1:15 PM</code> is still on May 18, but it is not equal to midnight.</p>

<p>So instead of asking:</p>

<blockquote>
<p>Is the date exactly <code>"2026-05-18"</code>?</p>
</blockquote>

<p>you are asking:</p>

<blockquote>
<p>Is the date on or after May 18 and before May 19?</p>
</blockquote>

<h2>
  
  
  6. Expecting Text Search to Work Automatically
</h2>

<p>MongoDB does not search text like Google by default.</p>

<p>In our <code>visits</code> collection, the doctor name is stored like this:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">doctor</span><span class="p">:</span> <span class="p">{</span>
  <span class="nl">fullName</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Dr. Michael Brown</span><span class="dl">"</span>
<span class="p">}</span>
</code></pre>

</div>



<p><strong>So this query will not work:</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>db.visits.find({
  "doctor.fullName": "Michael"
})
</code></pre>

</div>



<p>This searches for an exact value. MongoDB checks if <code>doctor.fullName</code> is exactly <code>"Michael"</code>.</p>

<p>But the real value is <code>"Dr. Michael Brown"</code>.</p>

<p><strong>Better setup:</strong></p>

<p>For text search, you need to create a text index first:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">db</span><span class="p">.</span><span class="nx">visits</span><span class="p">.</span><span class="nf">createIndex</span><span class="p">({</span>
  <span class="dl">"</span><span class="s2">doctor.fullName</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">text</span><span class="dl">"</span>
<span class="p">})</span>
</code></pre>

</div>



<p>Then you can search inside the text field:</p>

<p><a href="https://tsecurity.de/weiterlesen/3639368/3667509/7-mongodb-query-mistakes-that-return-the-wrong-results/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwptblq34hq57llfos5ra.png" alt="MongoDB Shell query in VisuaLeaf using $text search for “Michael,” with the matching doctor name shown in Table View." width="800" height="560"></a></p>

<p>Now MongoDB can search for the word <code>Michael</code> inside the indexed field.</p>

<p>The important part is this:</p>

<blockquote>
<p><code>$text</code> search does not work unless the collection has a text index.</p>
</blockquote>

<h2>
  
  
  7. Reading <code>$or</code> Logic Backwards
</h2>

<p>This query runs fine, but it is easy to read it *<strong><em>the wrong way</em></strong>*:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">db</span><span class="p">.</span><span class="nx">visits</span><span class="p">.</span><span class="nf">find</span><span class="p">({</span>
  <span class="na">status</span><span class="p">:</span> <span class="dl">"</span><span class="s2">completed</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">$or</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span> <span class="dl">"</span><span class="s2">doctor.specialization</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Neurology</span><span class="dl">"</span> <span class="p">},</span>
    <span class="p">{</span> <span class="dl">"</span><span class="s2">invoice.paymentStatus</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">unpaid</span><span class="dl">"</span> <span class="p">}</span>
  <span class="p">]</span>
<span class="p">})</span>
</code></pre>

</div>



<p>This does <strong>not</strong> mean:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>completed OR Neurology OR unpaid
</code></pre>

</div>



<p>It actually means:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>completed AND (Neurology OR unpaid)
</code></pre>

</div>



<p>Because <code>status</code> is outside the <code>$or</code> block, MongoDB treats it as required.</p>

<p>So MongoDB first looks for visits where <code>status</code> is <code>completed</code>. Then, from those visits, it checks if the doctor is specialized in <code>Neurology</code> or the invoice is <code>unpaid</code>.</p>

<p>If you want all three conditions to be part of the OR logic, move <code>status</code> inside the <code>$or</code> array.</p>

<p><strong>Better query:</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">db</span><span class="p">.</span><span class="nx">visits</span><span class="p">.</span><span class="nf">find</span><span class="p">({</span>
  <span class="na">$or</span><span class="p">:</span> <span class="p">[</span>
    <span class="p">{</span> <span class="na">status</span><span class="p">:</span> <span class="dl">"</span><span class="s2">completed</span><span class="dl">"</span> <span class="p">},</span>
    <span class="p">{</span> <span class="dl">"</span><span class="s2">doctor.specialization</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Neurology</span><span class="dl">"</span> <span class="p">},</span>
    <span class="p">{</span> <span class="dl">"</span><span class="s2">invoice.paymentStatus</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">unpaid</span><span class="dl">"</span> <span class="p">}</span>
  <span class="p">]</span>
<span class="p">})</span>
</code></pre>

</div>



<p>Now the query means:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>completed OR Neurology OR unpaid
</code></pre>

</div>



<p>Same fields. Different structure. Different result.</p>

<p><a href="https://tsecurity.de/weiterlesen/3639368/3667509/7-mongodb-query-mistakes-that-return-the-wrong-results/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzqjs8i0zq2a1mw1zswj8.png" alt="Side-by-side VisuaLeaf MongoDB Shell screenshot comparing two $or queries, showing how moving status inside the $or array returns more matching documents." width="800" height="480"></a></p>

<h2>
  
  
  One More Thing to Do before Using Your Query
</h2>

<p>A MongoDB query is only as good as your understanding of the underlying document structure.</p>

<p>Before you spend hours rewriting a broken query, do one simple thing: <a href="https://tsecurity.de/weiterlesen/3639368/3667509/7-mongodb-query-mistakes-that-return-the-wrong-results/" target="_blank" rel="noopener noreferrer"><strong>Open a single raw document from your collection.</strong></a></p>

<ul>
<li>Look closely at the exact spelling of field names.</li>
<li>Check the data types (Are numbers stored as strings? Are dates stored as objects?).</li>
<li>Map out your nested objects.</li>
</ul>

<p>This is exactly where a visual tool like <a href="https://tsecurity.de/weiterlesen/3639368/3667509/7-mongodb-query-mistakes-that-return-the-wrong-results/" target="_blank" rel="noopener noreferrer"><strong>VisuaLeaf</strong></a> saves the day. Instead of guessing from your code editor, you can test your queries inside the built-in shell and instantly toggle over to the <a href="https://tsecurity.de/weiterlesen/3639368/3667509/7-mongodb-query-mistakes-that-return-the-wrong-results/" target="_blank" rel="noopener noreferrer"><strong>Table View</strong> or <strong>Tree View</strong></a> to see exactly how your documents are laid out in real-time. No more guessing.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Token Jaccard Similarity in TypeScript: Simple Text Comparison]]></title>
<description><![CDATA[Hey TypeScript devs! 👋

If you need a fast, lightweight way to measure how similar two pieces of text are (duplicate detection, content recommendations, search result grouping, or data cleaning), Token Jaccard Similarity is an excellent choice.

It’s simple to understand, works great in both brow...]]></description>
<link>https://tsecurity.de/de/3667480/sichere-programmierung/token-jaccard-similarity-in-typescript-simple-text-comparison/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3667480/sichere-programmierung/token-jaccard-similarity-in-typescript-simple-text-comparison/</guid>
<pubDate>Tue, 14 Jul 2026 11:43:29 +0200</pubDate>
<content:encoded><![CDATA[<p>Hey TypeScript devs! 👋</p>

<p>If you need a fast, lightweight way to measure how similar two pieces of text are (duplicate detection, content recommendations, search result grouping, or data cleaning), <strong>Token Jaccard Similarity</strong> is an excellent choice.</p>

<p>It’s simple to understand, works great in both browser and Node.js, and requires zero dependencies.</p>

<h2>
  
  
  What is Jaccard Similarity?
</h2>

<p>The <strong>Jaccard index</strong> measures similarity between two sets:</p>

<p>

</p>
<div class="katex-element">
  <span class="katex-display"><span class="katex"><span class="katex-mathml"></span><span class="katex-html"><span class="base"><span class="strut"></span><span class="mord mathnormal">J</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mpunct">,</span><span class="mspace"></span><span class="mord mathnormal">B</span><span class="mclose">)</span><span class="mspace"></span><span class="mrel">=</span><span class="mspace"></span></span><span class="base"><span class="strut"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist"><span><span class="pstrut"></span><span class="mord"><span class="mord">∣</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∪</span><span class="mspace"></span><span class="mord mathnormal">B</span><span class="mord">∣</span></span></span><span><span class="pstrut"></span><span class="frac-line"></span></span><span><span class="pstrut"></span><span class="mord"><span class="mord">∣</span><span class="mord mathnormal">A</span><span class="mspace"></span><span class="mbin">∩</span><span class="mspace"></span><span class="mord mathnormal">B</span><span class="mord">∣</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span>
</div>


<ul>
<li>Intersection = tokens present in <strong>both</strong> texts
</li>
<li>Union = all <strong>unique</strong> tokens from either text
</li>
</ul>

<p>Result ranges from <strong>0</strong> (completely different) to <strong>1</strong> (identical).</p>

<h2>
  
  
  Token Jaccard = Jaccard applied to words
</h2>

<p>We tokenize the text into words, convert them into <code>Set</code>s (removing duplicates and order), then apply the formula.</p>

<h3>
  
  
  Quick Example
</h3>

<p><strong>Text A:</strong><br><br>
<code>the quick brown fox jumps over the lazy dog</code></p>

<p><strong>Text B:</strong><br><br>
<code>a quick brown fox jumps over a lazy dog</code></p>

<p><strong>Unique tokens:</strong></p>

<ul>
<li>Text A: <code>the, quick, brown, fox, jumps, over, lazy, dog</code>
</li>
<li>Text B: <code>a, quick, brown, fox, jumps, over, lazy, dog</code>
</li>
</ul>

<p><strong>Intersection:</strong> 7 tokens<br><br>
<strong>Union:</strong> 9 tokens  </p>

<p><strong>Jaccard Similarity ≈ 0.78</strong> (78% similar)</p>
<h2>
  
  
  TypeScript Implementation
</h2>

<p>Here’s a clean, fully typed implementation:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight typescript"><code><span class="kd">function</span> <span class="nf">tokenize</span><span class="p">(</span><span class="nx">text</span><span class="p">:</span> <span class="kr">string</span><span class="p">):</span> <span class="nb">Set</span><span class="o">&lt;</span><span class="kr">string</span><span class="o">&gt;</span> <span class="p">{</span>
  <span class="c1">// Matches words (alphanumeric), lowercased</span>
  <span class="kd">const</span> <span class="nx">matches</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nf">toLowerCase</span><span class="p">().</span><span class="nf">match</span><span class="p">(</span><span class="sr">/</span><span class="se">\b\w</span><span class="sr">+</span><span class="se">\b</span><span class="sr">/g</span><span class="p">);</span>
  <span class="k">return</span> <span class="k">new</span> <span class="nc">Set</span><span class="p">(</span><span class="nx">matches</span> <span class="o">??</span> <span class="p">[]);</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nf">jaccardSimilarity</span><span class="p">(</span><span class="nx">text1</span><span class="p">:</span> <span class="kr">string</span><span class="p">,</span> <span class="nx">text2</span><span class="p">:</span> <span class="kr">string</span><span class="p">):</span> <span class="kr">number</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">set1</span> <span class="o">=</span> <span class="nf">tokenize</span><span class="p">(</span><span class="nx">text1</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">set2</span> <span class="o">=</span> <span class="nf">tokenize</span><span class="p">(</span><span class="nx">text2</span><span class="p">);</span>

  <span class="k">if </span><span class="p">(</span><span class="nx">set1</span><span class="p">.</span><span class="nx">size</span> <span class="o">===</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nx">set2</span><span class="p">.</span><span class="nx">size</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="c1">// Calculate intersection size</span>
  <span class="kd">let</span> <span class="nx">intersectionSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">for </span><span class="p">(</span><span class="kd">const</span> <span class="nx">token</span> <span class="k">of</span> <span class="nx">set1</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if </span><span class="p">(</span><span class="nx">set2</span><span class="p">.</span><span class="nf">has</span><span class="p">(</span><span class="nx">token</span><span class="p">))</span> <span class="p">{</span>
      <span class="nx">intersectionSize</span><span class="o">++</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>

  <span class="kd">const</span> <span class="nx">unionSize</span> <span class="o">=</span> <span class="nx">set1</span><span class="p">.</span><span class="nx">size</span> <span class="o">+</span> <span class="nx">set2</span><span class="p">.</span><span class="nx">size</span> <span class="o">-</span> <span class="nx">intersectionSize</span><span class="p">;</span>

  <span class="k">return</span> <span class="nx">intersectionSize</span> <span class="o">/</span> <span class="nx">unionSize</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// ======================</span>
<span class="c1">// Example usage</span>
<span class="c1">// ======================</span>

<span class="kd">const</span> <span class="nx">textA</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">the quick brown fox jumps over the lazy dog</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">textB</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">a quick brown fox jumps over a lazy dog</span><span class="dl">"</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">score</span> <span class="o">=</span> <span class="nf">jaccardSimilarity</span><span class="p">(</span><span class="nx">textA</span><span class="p">,</span> <span class="nx">textB</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Jaccard Similarity: </span><span class="p">${</span><span class="nx">score</span><span class="p">.</span><span class="nf">toFixed</span><span class="p">(</span><span class="mi">4</span><span class="p">)}</span><span class="s2">`</span><span class="p">);</span> 
<span class="c1">// → Jaccard Similarity: 0.7778</span>
</code></pre>

</div>



<h3>
  
  
  Another Example
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight typescript"><code><span class="kd">const</span> <span class="nx">textC</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Building a recommendation system using TypeScript and machine learning</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">textD</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">How to create a recommendation engine with TypeScript and ML</span><span class="dl">"</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">jaccardSimilarity</span><span class="p">(</span><span class="nx">textC</span><span class="p">,</span> <span class="nx">textD</span><span class="p">).</span><span class="nf">toFixed</span><span class="p">(</span><span class="mi">2</span><span class="p">));</span> 
<span class="c1">// → 0.50</span>
</code></pre>

</div>



<h2>
  
  
  Real-World Use Cases
</h2>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Use Case</th>
<th>Why It Works Well in TypeScript</th>
<th>Suggested Threshold</th>
</tr>
</thead>
<tbody>
<tr>
<td>Duplicate content detection</td>
<td>Extremely fast even on large datasets</td>
<td>&gt; 0.85</td>
</tr>
<tr>
<td>Article / blog recommendations</td>
<td>Good for topic similarity</td>
<td>0.4 – 0.65</td>
</tr>
<tr>
<td>Dataset deduplication</td>
<td>Lightweight preprocessing step</td>
<td>&gt; 0.90</td>
</tr>
<tr>
<td>Search result clustering</td>
<td>Quick fuzzy grouping</td>
<td>&gt; 0.70</td>
</tr>
<tr>
<td>Basic plagiarism detection</td>
<td>Simple and explainable baseline</td>
<td>&gt; 0.60</td>
</tr>
</tbody>
</table></div>

<h2>
  
  
  Limitations &amp; Quick Improvements
</h2>

<p>Token Jaccard is great but has trade-offs:</p>

<ul>
<li>Ignores word order and semantics</li>
<li>Sensitive to common words (“the”, “a”, “is”)</li>
</ul>

<h3>
  
  
  Easy Upgrades
</h3>

<ol>
<li>Remove stop words before tokenizing</li>
<li>Use <strong>n-grams</strong> (word or character shingles) instead of single words</li>
<li>Combine with other metrics (e.g. cosine similarity on embeddings)</li>
</ol>

<p>But for most practical needs, plain Token Jaccard in TypeScript is already very effective and blazing fast.</p>

<h2>
  
  
  When to Use It
</h2>

<ul>
<li>You want something <strong>simple and dependency-free</strong>
</li>
<li>You’re working in <strong>TypeScript / JavaScript</strong> (frontend, backend, or full-stack)</li>
<li>You need <strong>explainable</strong> results</li>
<li>You’re building a quick prototype or data pipeline</li>
</ul>

<h2>
  
  
  Conclusion
</h2>

<p>Token Jaccard Similarity remains one of the most practical tools for text comparison. With this TypeScript version, you can drop it into any project instantly — browser, Node.js, Deno, or even Edge functions.</p>

<p>Would you like me to show:</p>

<ul>
<li>A version with stop-word removal?</li>
<li>N-gram (shingle) based Jaccard?</li>
<li>How to use it efficiently at scale?</li>
</ul>

<p>Just let me know in the comments!</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Building a FastAPI Backend That Serves Live Satellite Imagery and Orbital Position]]></title>
<description><![CDATA[TL;DR — I built a full-stack app that shows one place — the Sheffield Cholera Monument — from two scales at once: a satellite's-eye vegetation view from space, and a centimeter-scale 3D model from the ground. This post is about the backend: a FastAPI service that authenticates against the Coperni...]]></description>
<link>https://tsecurity.de/de/3666805/sichere-programmierung/building-a-fastapi-backend-that-serves-live-satellite-imagery-and-orbital-position/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3666805/sichere-programmierung/building-a-fastapi-backend-that-serves-live-satellite-imagery-and-orbital-position/</guid>
<pubDate>Tue, 14 Jul 2026 05:41:52 +0200</pubDate>
<content:encoded><![CDATA[<p><strong>TL;DR</strong> — I built a full-stack app that shows one place — the Sheffield Cholera Monument — from two scales at once: a satellite's-eye vegetation view from space, and a centimeter-scale 3D model from the ground. This post is about the backend: a FastAPI service that authenticates against the Copernicus Sentinel Hub, pulls the <em>newest</em> real Sentinel-2 scene over a bounding box, computes NDVI, and then pins a satellite marker to the exact point in orbit where Sentinel-2A passed closest to the monument for that scene. The satellite-data pipeline is the heart of it, so that's where I'll spend most of the words.</p>

<p><strong>What you'll get out of it</strong></p>

<ul>
<li>How to obtain live satellite imagery from Copernicus: OAuth token, then the Catalog, Process, and Statistics APIs</li>
<li>Why "the newest scene" is a real query, not a timestamp — and how to pin every view to that one scene</li>
<li>Turning a two-line element (TLE) into a satellite position with Skyfield + SGP4, vectorized with NumPy</li>
<li>Designing endpoints that <em>never</em> break the frontend, even when an upstream API is down</li>
</ul>




<h3>
  
  
  Contents
</h3>

<ol>
<li>The idea: one place, two scales</li>
<li>Getting satellite data, step one: authentication</li>
<li>Step two: finding the newest real scene</li>
<li>Step three: NDVI imagery and statistics</li>
<li>Step four: from a TLE to a position in orbit</li>
<li>Pinning the satellite to the scene</li>
<li>Designing endpoints that can't break the frontend</li>
<li>Keeping it light: caching</li>
<li>Takeaways</li>
</ol>




<h3>
  
  
  The idea: one place, two scales
</h3>

<p>The project's thesis is simple: <em>observation scale changes what you can understand about a place.</em> From orbit, Sentinel-2 sees vegetation health across a whole neighborhood at ~10 m per pixel but knows nothing of texture. From the ground, a photogrammetric mesh captures sub-centimeter detail of a single monument but sees nothing of its surroundings. Put both on one interactive globe and the contrast becomes the point.</p>

<p>The frontend is a CesiumJS 3D globe; the ground model is a RealityScan <code>.glb</code>. Neither is what makes this a backend story. What makes it a backend story is everything that has to happen server-side to get <em>live, honest, self-consistent</em> satellite data onto that globe — where "self-consistent" means the imagery, the reported date, and the satellite's position all describe <strong>the same acquisition</strong>.</p>

<p>The stack for that:</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Concern</th>
<th>Tool</th>
</tr>
</thead>
<tbody>
<tr>
<td>API server</td>
<td>FastAPI + Uvicorn</td>
</tr>
<tr>
<td>Imagery &amp; metadata</td>
<td>Copernicus Sentinel Hub (Catalog / Process / Statistics APIs)</td>
</tr>
<tr>
<td>Orbital mechanics</td>
<td>Skyfield (SGP4 propagation)</td>
</tr>
<tr>
<td>Live orbital elements</td>
<td>Celestrak TLE feed</td>
</tr>
<tr>
<td>Math</td>
<td>NumPy (vectorized)</td>
</tr>
</tbody>
</table></div>

<p>Four endpoints: <code>latest-scene</code>, <code>ndvi</code>, <code>ndvi-stats</code>, and <code>orbit-at-scene-time</code>. Let's build the data pipeline in the order the data actually flows.</p>




<h3>
  
  
  Getting satellite data, step one: authentication
</h3>

<p>Copernicus Sentinel Hub uses OAuth2 client-credentials. You register an app in the Copernicus Data Space, get a client ID and secret, and exchange them for a short-lived bearer token that every subsequent request carries. The secret never touches the frontend — it lives in backend environment variables (set in the Render dashboard in production), which is the entire reason a backend exists here rather than calling the API from the browser.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">TOKEN_URL</span> <span class="o">=</span> <span class="sh">"</span><span class="s">https://identity.dataspace.copernicus.eu/auth/realms/CDSE/protocol/openid-connect/token</span><span class="sh">"</span>

<span class="k">def</span> <span class="nf">get_token</span><span class="p">():</span>
    <span class="n">res</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">post</span><span class="p">(</span>
        <span class="n">TOKEN_URL</span><span class="p">,</span>
        <span class="n">data</span><span class="o">=</span><span class="p">{</span>
            <span class="sh">"</span><span class="s">grant_type</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">client_credentials</span><span class="sh">"</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">client_id</span><span class="sh">"</span><span class="p">:</span> <span class="n">CLIENT_ID</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">client_secret</span><span class="sh">"</span><span class="p">:</span> <span class="n">CLIENT_SECRET</span><span class="p">,</span>
        <span class="p">},</span>
        <span class="n">timeout</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
    <span class="p">)</span>
    <span class="n">res</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
    <span class="k">return</span> <span class="n">res</span><span class="p">.</span><span class="nf">json</span><span class="p">()[</span><span class="sh">"</span><span class="s">access_token</span><span class="sh">"</span><span class="p">]</span>
</code></pre>

</div>



<p>That's the whole handshake. Every data call below starts by getting a token and putting it in an <code>Authorization: Bearer …</code> header. The backend is, among other things, an <strong>auth proxy</strong>: it holds the credentials, and the browser only ever talks to the backend.</p>




<h3>
  
  
  Step two: finding the newest real scene
</h3>

<p>Here's the design decision that shapes everything: the dashboard shows <em>the newest available scene</em>, and reports that scene's <strong>real acquisition date</strong> — not the time you happened to load the page. Satellites don't image every spot continuously; Sentinel-2 revisits a given area every few days, and cloud cover knocks out many passes. So "what's the latest usable image of this exact place?" is a genuine query.</p>

<p>That query goes to the Sentinel Hub <strong>Catalog API</strong>. I ask for every Sentinel-2 L2A scene intersecting my bounding box in the last 30 days, then sort client-side and pick the newest one under a cloud-cover threshold:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">BBOX</span> <span class="o">=</span> <span class="p">[</span><span class="o">-</span><span class="mf">1.4635</span><span class="p">,</span> <span class="mf">53.3745</span><span class="p">,</span> <span class="o">-</span><span class="mf">1.4550</span><span class="p">,</span> <span class="mf">53.3798</span><span class="p">]</span>  <span class="c1"># around the monument
</span>
<span class="k">def</span> <span class="nf">get_latest_scene_meta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span> <span class="n">max_cloud</span><span class="o">=</span><span class="mi">30</span><span class="p">):</span>
    <span class="n">now</span> <span class="o">=</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">(</span><span class="n">timezone</span><span class="p">.</span><span class="n">utc</span><span class="p">)</span>
    <span class="n">start</span> <span class="o">=</span> <span class="n">now</span> <span class="o">-</span> <span class="nf">timedelta</span><span class="p">(</span><span class="n">days</span><span class="o">=</span><span class="n">days</span><span class="p">)</span>
    <span class="n">body</span> <span class="o">=</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">collections</span><span class="sh">"</span><span class="p">:</span> <span class="p">[</span><span class="sh">"</span><span class="s">sentinel-2-l2a</span><span class="sh">"</span><span class="p">],</span>
        <span class="sh">"</span><span class="s">bbox</span><span class="sh">"</span><span class="p">:</span> <span class="n">BBOX</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">datetime</span><span class="sh">"</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">start</span><span class="si">:</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">dT</span><span class="o">%</span><span class="n">H</span><span class="si">:</span><span class="o">%</span><span class="n">M</span><span class="si">:</span><span class="o">%</span><span class="n">SZ</span><span class="si">}</span><span class="s">/</span><span class="si">{</span><span class="n">now</span><span class="si">:</span><span class="o">%</span><span class="n">Y</span><span class="o">-%</span><span class="n">m</span><span class="o">-%</span><span class="n">dT</span><span class="o">%</span><span class="n">H</span><span class="si">:</span><span class="o">%</span><span class="n">M</span><span class="si">:</span><span class="o">%</span><span class="n">SZ</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">limit</span><span class="sh">"</span><span class="p">:</span> <span class="mi">50</span><span class="p">,</span>
    <span class="p">}</span>
    <span class="n">token</span> <span class="o">=</span> <span class="nf">get_token</span><span class="p">()</span>
    <span class="n">res</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">post</span><span class="p">(</span><span class="n">CATALOG_URL</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="sh">"</span><span class="s">Authorization</span><span class="sh">"</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Bearer </span><span class="si">{</span><span class="n">token</span><span class="si">}</span><span class="sh">"</span><span class="p">},</span>
                        <span class="n">json</span><span class="o">=</span><span class="n">body</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">30</span><span class="p">)</span>
    <span class="n">res</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
    <span class="n">feats</span> <span class="o">=</span> <span class="n">res</span><span class="p">.</span><span class="nf">json</span><span class="p">().</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">features</span><span class="sh">"</span><span class="p">,</span> <span class="p">[])</span>

    <span class="c1"># newest first
</span>    <span class="n">feats</span><span class="p">.</span><span class="nf">sort</span><span class="p">(</span><span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">f</span><span class="p">:</span> <span class="n">f</span><span class="p">[</span><span class="sh">"</span><span class="s">properties</span><span class="sh">"</span><span class="p">].</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">datetime</span><span class="sh">"</span><span class="p">,</span> <span class="sh">""</span><span class="p">),</span> <span class="n">reverse</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
    <span class="c1"># newest scene under the cloud threshold, else newest of all
</span>    <span class="n">chosen</span> <span class="o">=</span> <span class="nf">next</span><span class="p">(</span>
        <span class="p">(</span><span class="n">f</span> <span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">feats</span> <span class="k">if</span> <span class="n">f</span><span class="p">[</span><span class="sh">"</span><span class="s">properties</span><span class="sh">"</span><span class="p">].</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">eo:cloud_cover</span><span class="sh">"</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="n">max_cloud</span><span class="p">),</span>
        <span class="bp">None</span><span class="p">,</span>
    <span class="p">)</span> <span class="ow">or</span> <span class="p">(</span><span class="n">feats</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">feats</span> <span class="k">else</span> <span class="bp">None</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">chosen</span><span class="p">:</span>
        <span class="k">return</span> <span class="p">{</span>
            <span class="sh">"</span><span class="s">datetime</span><span class="sh">"</span><span class="p">:</span> <span class="n">chosen</span><span class="p">[</span><span class="sh">"</span><span class="s">properties</span><span class="sh">"</span><span class="p">][</span><span class="sh">"</span><span class="s">datetime</span><span class="sh">"</span><span class="p">],</span>
            <span class="sh">"</span><span class="s">cloud_cover</span><span class="sh">"</span><span class="p">:</span> <span class="nf">round</span><span class="p">(</span><span class="nf">float</span><span class="p">(</span><span class="n">chosen</span><span class="p">[</span><span class="sh">"</span><span class="s">properties</span><span class="sh">"</span><span class="p">].</span><span class="nf">get</span><span class="p">(</span><span class="sh">"</span><span class="s">eo:cloud_cover</span><span class="sh">"</span><span class="p">,</span> <span class="mi">0</span><span class="p">)),</span> <span class="mi">1</span><span class="p">),</span>
        <span class="p">}</span>
    <span class="k">return</span> <span class="bp">None</span>
</code></pre>

</div>



<p>Two small robustness choices worth calling out. Sorting happens <strong>client-side</strong> rather than via a <code>sortby</code> in the request, because not every catalog deployment supports that parameter reliably — sorting 50 features locally is free and removes a compatibility assumption. And the <code>or feats[0]</code> fallback means that if <em>every</em> recent scene is cloudy, the dashboard still shows the newest one rather than nothing; a cloudy real scene beats an empty panel. The whole function returns <code>None</code> on any failure so callers can degrade gracefully — a pattern that becomes a theme.</p>

<p>The <code>latest-scene</code> endpoint wraps this and returns a clean metadata object. Crucially, that scene's <code>datetime</code> becomes the anchor every other view is tied to.</p>




<h3>
  
  
  Step three: NDVI imagery and statistics
</h3>

<p>NDVI — the Normalized Difference Vegetation Index — is the classic "how green is it" measure: <code>(NIR − Red) / (NIR + Red)</code>, using Sentinel-2's B08 (near-infrared) and B04 (red) bands. Healthy vegetation reflects strongly in NIR and absorbs red, so it scores high.</p>

<p>Sentinel Hub's <strong>Process API</strong> lets you compute this server-side at the source with an <em>evalscript</em> — a small JS function that runs per pixel on the imagery — and hand back a finished PNG. No raw bands cross the network; you receive exactly the visualization you asked for. I bucket the NDVI values into a simple color ramp from bare-earth brown to dense-vegetation green:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">evalscript</span> <span class="o">=</span> <span class="sh">"""</span><span class="s">
//VERSION=3
function setup() {
  return { input: [</span><span class="sh">"</span><span class="s">B04</span><span class="sh">"</span><span class="s">, </span><span class="sh">"</span><span class="s">B08</span><span class="sh">"</span><span class="s">], output: { bands: 3 } };
}
function evaluatePixel(sample) {
  let ndvi = (sample.B08 - sample.B04) / (sample.B08 + sample.B04);
  if (ndvi &lt; 0.0) return [0.3, 0.2, 0.1];
  if (ndvi &lt; 0.2) return [0.8, 0.7, 0.3];
  if (ndvi &lt; 0.4) return [0.4, 0.8, 0.3];
  if (ndvi &lt; 0.6) return [0.2, 0.6, 0.2];
  return [0.0, 0.4, 0.0];
}
</span><span class="sh">"""</span>
</code></pre>

</div>



<p>The request sends this evalscript alongside the bounding box, a 30-day time range, a 30% cloud filter, and a <code>512×512</code> output size, then streams the PNG straight back to the browser:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">res</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">post</span><span class="p">(</span><span class="n">PROCESS_URL</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="sh">"</span><span class="s">Authorization</span><span class="sh">"</span><span class="p">:</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Bearer </span><span class="si">{</span><span class="n">token</span><span class="si">}</span><span class="sh">"</span><span class="p">},</span> <span class="n">json</span><span class="o">=</span><span class="n">payload</span><span class="p">)</span>
<span class="k">if</span> <span class="n">res</span><span class="p">.</span><span class="n">status_code</span> <span class="o">!=</span> <span class="mi">200</span><span class="p">:</span>
    <span class="k">return</span> <span class="nc">JSONResponse</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">res</span><span class="p">.</span><span class="nf">json</span><span class="p">(),</span> <span class="n">status_code</span><span class="o">=</span><span class="n">res</span><span class="p">.</span><span class="n">status_code</span><span class="p">)</span>
<span class="k">return</span> <span class="nc">Response</span><span class="p">(</span><span class="n">content</span><span class="o">=</span><span class="n">res</span><span class="p">.</span><span class="n">content</span><span class="p">,</span> <span class="n">media_type</span><span class="o">=</span><span class="sh">"</span><span class="s">image/png</span><span class="sh">"</span><span class="p">)</span>
</code></pre>

</div>



<p>512×512 is a deliberate balance: fine enough to show real spatial structure at Sentinel-2's resolution, small enough to stay snappy for real-time draping over the globe.</p>

<p>The <code>ndvi-stats</code> endpoint does the numerical companion via the <strong>Statistics API</strong>, aggregating NDVI daily over a 60-day window and pulling out the mean — this time with a <code>dataMask</code> band so cloud/no-data pixels are excluded from the average rather than dragging it down. It returns a single <code>{"mean": 0.342}</code> for the telemetry readout.</p>




<h3>
  
  
  Step four: from a TLE to a position in orbit
</h3>

<p>This is the part I find most fun, and the part most people haven't built. I want a marker on the globe showing <em>where Sentinel-2A actually was</em> when it captured the scene — sitting on its real ground track, not a decorative dot.</p>

<p>The raw material is a <strong>TLE</strong> (two-line element set): a compact, standardized encoding of a satellite's orbit at a moment in time (its "epoch"). Celestrak publishes fresh TLEs for active satellites. I fetch the active catalog and pull out Sentinel-2A specifically:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="k">def</span> <span class="nf">fetch_sentinel2a_tle</span><span class="p">():</span>
    <span class="n">req</span> <span class="o">=</span> <span class="n">urllib</span><span class="p">.</span><span class="n">request</span><span class="p">.</span><span class="nc">Request</span><span class="p">(</span><span class="n">TLE_URL</span><span class="p">,</span> <span class="n">headers</span><span class="o">=</span><span class="p">{</span><span class="sh">"</span><span class="s">User-Agent</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">Mozilla/5.0</span><span class="sh">"</span><span class="p">})</span>
    <span class="k">with</span> <span class="n">urllib</span><span class="p">.</span><span class="n">request</span><span class="p">.</span><span class="nf">urlopen</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span> <span class="k">as</span> <span class="n">response</span><span class="p">:</span>
        <span class="n">lines</span> <span class="o">=</span> <span class="p">[</span><span class="n">l</span><span class="p">.</span><span class="nf">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">response</span><span class="p">.</span><span class="nf">read</span><span class="p">().</span><span class="nf">decode</span><span class="p">().</span><span class="nf">splitlines</span><span class="p">()</span> <span class="k">if</span> <span class="n">l</span><span class="p">.</span><span class="nf">strip</span><span class="p">()]</span>
    <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">-</span> <span class="mi">2</span><span class="p">):</span>
        <span class="k">if</span> <span class="sh">"</span><span class="s">SENTINEL-2A</span><span class="sh">"</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="nf">upper</span><span class="p">()</span> <span class="ow">and</span> <span class="n">lines</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">].</span><span class="nf">startswith</span><span class="p">(</span><span class="sh">"</span><span class="s">1 </span><span class="sh">"</span><span class="p">):</span>
            <span class="k">return</span> <span class="n">lines</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">lines</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">],</span> <span class="n">lines</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">2</span><span class="p">]</span>
    <span class="c1"># …hardcoded fallback TLE if the fetch fails…
</span></code></pre>

</div>



<p>A TLE isn't a position — it's the input to a <em>propagator</em>. <strong>SGP4</strong> is the standard model that turns "here's the orbit" plus "here's a time" into an actual Earth-centered coordinate. <strong>Skyfield</strong> wraps SGP4 in a friendly API and does the coordinate conversions. Feeding it the TLE and an array of times gives sub-satellite points (the latitude/longitude directly beneath the satellite):<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="kn">from</span> <span class="n">skyfield.api</span> <span class="kn">import</span> <span class="n">EarthSatellite</span><span class="p">,</span> <span class="n">load</span><span class="p">,</span> <span class="n">wgs84</span>

<span class="n">ts</span> <span class="o">=</span> <span class="n">load</span><span class="p">.</span><span class="nf">timescale</span><span class="p">()</span>
<span class="n">name</span><span class="p">,</span> <span class="n">l1</span><span class="p">,</span> <span class="n">l2</span> <span class="o">=</span> <span class="nf">fetch_sentinel2a_tle</span><span class="p">()</span>
<span class="n">sat</span> <span class="o">=</span> <span class="nc">EarthSatellite</span><span class="p">(</span><span class="n">l1</span><span class="p">,</span> <span class="n">l2</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">ts</span><span class="p">)</span>

<span class="c1"># a whole array of times at once
</span><span class="n">sp</span> <span class="o">=</span> <span class="n">wgs84</span><span class="p">.</span><span class="nf">subpoint</span><span class="p">(</span><span class="n">sat</span><span class="p">.</span><span class="nf">at</span><span class="p">(</span><span class="n">ts</span><span class="p">.</span><span class="nf">utc</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">mo</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">mi</span><span class="p">,</span> <span class="n">s</span> <span class="o">+</span> <span class="n">seconds_array</span><span class="p">)))</span>
<span class="n">lats</span><span class="p">,</span> <span class="n">lons</span> <span class="o">=</span> <span class="n">sp</span><span class="p">.</span><span class="n">latitude</span><span class="p">.</span><span class="n">degrees</span><span class="p">,</span> <span class="n">sp</span><span class="p">.</span><span class="n">longitude</span><span class="p">.</span><span class="n">degrees</span>
</code></pre>

</div>



<p>The thing to notice: Skyfield is <strong>vectorized</strong>. You pass a NumPy array of time offsets and get back arrays of positions in one call, rather than looping second-by-second. That matters a lot for the next step, where I evaluate the orbit at thousands of instants.</p>




<h3>
  
  
  Pinning the satellite to the scene
</h3>

<p>Reporting Sentinel-2A's position at some arbitrary instant would put the marker wherever the satellite happens to be — usually nowhere near Sheffield. What I actually want is its <strong>closest approach to the monument</strong> around the scene's acquisition time. I find it with a coarse-then-fine search, both fully vectorized:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="k">def</span> <span class="nf">_haversine_km</span><span class="p">(</span><span class="n">lats</span><span class="p">,</span> <span class="n">lons</span><span class="p">):</span>
    <span class="n">dlat</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">radians</span><span class="p">(</span><span class="n">lats</span> <span class="o">-</span> <span class="n">MONUMENT_LAT</span><span class="p">)</span>
    <span class="n">dlon</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">radians</span><span class="p">(</span><span class="n">lons</span> <span class="o">-</span> <span class="n">MONUMENT_LON</span><span class="p">)</span>
    <span class="n">a</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="n">dlat</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span>
         <span class="o">+</span> <span class="n">np</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">radians</span><span class="p">(</span><span class="n">MONUMENT_LAT</span><span class="p">))</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">radians</span><span class="p">(</span><span class="n">lats</span><span class="p">))</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="n">dlon</span><span class="o">/</span><span class="mi">2</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
    <span class="k">return</span> <span class="mi">6371</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="nf">arctan2</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="n">np</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">a</span><span class="p">))</span>

<span class="c1"># Coarse scan: ±1 day around the scene, one sample per 60 s
</span><span class="n">sec</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="mi">86400</span><span class="p">,</span> <span class="mi">60</span><span class="p">)</span>
<span class="n">sp</span> <span class="o">=</span> <span class="n">wgs84</span><span class="p">.</span><span class="nf">subpoint</span><span class="p">(</span><span class="n">sat</span><span class="p">.</span><span class="nf">at</span><span class="p">(</span><span class="n">ts</span><span class="p">.</span><span class="nf">utc</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">mo</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">mi</span><span class="p">,</span> <span class="n">s</span> <span class="o">+</span> <span class="n">sec</span><span class="p">)))</span>
<span class="n">dist</span> <span class="o">=</span> <span class="nf">_haversine_km</span><span class="p">(</span><span class="n">sp</span><span class="p">.</span><span class="n">latitude</span><span class="p">.</span><span class="n">degrees</span><span class="p">,</span> <span class="n">sp</span><span class="p">.</span><span class="n">longitude</span><span class="p">.</span><span class="n">degrees</span><span class="p">)</span>
<span class="n">coarse_s</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="n">sec</span><span class="p">[</span><span class="nf">int</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">argmin</span><span class="p">(</span><span class="n">dist</span><span class="p">))])</span>

<span class="c1"># Refine: ±60 s around that minimum, one sample per second
</span><span class="n">rsec</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">arange</span><span class="p">(</span><span class="n">coarse_s</span> <span class="o">-</span> <span class="mi">60</span><span class="p">,</span> <span class="n">coarse_s</span> <span class="o">+</span> <span class="mi">61</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">rsp</span> <span class="o">=</span> <span class="n">wgs84</span><span class="p">.</span><span class="nf">subpoint</span><span class="p">(</span><span class="n">sat</span><span class="p">.</span><span class="nf">at</span><span class="p">(</span><span class="n">ts</span><span class="p">.</span><span class="nf">utc</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">mo</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">mi</span><span class="p">,</span> <span class="n">s</span> <span class="o">+</span> <span class="n">rsec</span><span class="p">)))</span>
<span class="n">rdist</span> <span class="o">=</span> <span class="nf">_haversine_km</span><span class="p">(</span><span class="n">rsp</span><span class="p">.</span><span class="n">latitude</span><span class="p">.</span><span class="n">degrees</span><span class="p">,</span> <span class="n">rsp</span><span class="p">.</span><span class="n">longitude</span><span class="p">.</span><span class="n">degrees</span><span class="p">)</span>
<span class="n">closest_s</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="n">rsec</span><span class="p">[</span><span class="nf">int</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">argmin</span><span class="p">(</span><span class="n">rdist</span><span class="p">))])</span>
</code></pre>

</div>



<p>The haversine gives great-circle distance from each sub-satellite point to the monument. The coarse pass (2,880 samples across two days) narrows to the right minute; the refinement (121 one-second samples) pinpoints the exact second of closest approach. Because the newest scene <em>was itself captured</em> as Sentinel-2A flew over Sheffield, that closest approach correctly lands right over the monument — the imagery and the orbit agree because they describe the same overpass.</p>

<p>Finally I build a ±45-minute ground track (181 points at 30-second spacing) centered on that closest second, so the frontend can draw the arc of the orbit with the marker glued to the middle of it:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="n">tsec</span> <span class="o">=</span> <span class="n">closest_s</span> <span class="o">+</span> <span class="n">np</span><span class="p">.</span><span class="nf">arange</span><span class="p">(</span><span class="o">-</span><span class="mi">2700</span><span class="p">,</span> <span class="mi">2701</span><span class="p">,</span> <span class="mi">30</span><span class="p">)</span>   <span class="c1"># ±45 min, 30 s steps
</span><span class="n">tsp</span> <span class="o">=</span> <span class="n">wgs84</span><span class="p">.</span><span class="nf">subpoint</span><span class="p">(</span><span class="n">sat</span><span class="p">.</span><span class="nf">at</span><span class="p">(</span><span class="n">ts</span><span class="p">.</span><span class="nf">utc</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">mo</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">mi</span><span class="p">,</span> <span class="n">s</span> <span class="o">+</span> <span class="n">tsec</span><span class="p">)))</span>
<span class="n">track_points</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">{</span><span class="sh">"</span><span class="s">lon</span><span class="sh">"</span><span class="p">:</span> <span class="nf">float</span><span class="p">(</span><span class="n">lo</span><span class="p">),</span> <span class="sh">"</span><span class="s">lat</span><span class="sh">"</span><span class="p">:</span> <span class="nf">float</span><span class="p">(</span><span class="n">la</span><span class="p">),</span> <span class="sh">"</span><span class="s">altitude_m</span><span class="sh">"</span><span class="p">:</span> <span class="n">SAT_ALTITUDE_M</span><span class="p">}</span>
    <span class="k">for</span> <span class="n">la</span><span class="p">,</span> <span class="n">lo</span> <span class="ow">in</span> <span class="nf">zip</span><span class="p">(</span><span class="n">tsp</span><span class="p">.</span><span class="n">latitude</span><span class="p">.</span><span class="n">degrees</span><span class="p">,</span> <span class="n">tsp</span><span class="p">.</span><span class="n">longitude</span><span class="p">.</span><span class="n">degrees</span><span class="p">)</span>
<span class="p">]</span>
</code></pre>

</div>



<p>One honesty note I put in the README too: this design deliberately only tracks the <em>newest</em> scene, whose date is always recent. That keeps the current Celestrak TLE's epoch close to the scene time, so SGP4 stays accurate without hunting down epoch-matched historical TLEs. Historical-scene accuracy is intentionally out of scope — a scoped limitation is better than a silent inaccuracy.</p>




<h3>
  
  
  Designing endpoints that can't break the frontend
</h3>

<p>The globe refreshes every five minutes and calls all four endpoints. Any of them depends on a third party — Copernicus, Celestrak — that can rate-limit, time out, or briefly vanish. A 500 error here isn't just an empty panel; because of how CORS works, a raised exception can arrive at the browser <em>without</em> the CORS headers, turning a transient upstream hiccup into a confusing cross-origin error in the console.</p>

<p>So the orbit endpoint is built to <strong>always return valid JSON</strong>, falling back to a safe position over the monument rather than raising:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="nd">@app.get</span><span class="p">(</span><span class="sh">"</span><span class="s">/api/orbit-at-scene-time</span><span class="sh">"</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">orbit</span><span class="p">():</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">meta</span> <span class="o">=</span> <span class="nf">get_latest_scene_meta</span><span class="p">()</span>
        <span class="n">ref_dt</span> <span class="o">=</span> <span class="nf">parse_iso</span><span class="p">(</span><span class="n">meta</span><span class="p">[</span><span class="sh">"</span><span class="s">datetime</span><span class="sh">"</span><span class="p">])</span> <span class="k">if</span> <span class="n">meta</span> <span class="k">else</span> <span class="n">datetime</span><span class="p">.</span><span class="nf">now</span><span class="p">(</span><span class="n">timezone</span><span class="p">.</span><span class="n">utc</span><span class="p">)</span>
        <span class="n">key</span> <span class="o">=</span> <span class="n">ref_dt</span><span class="p">.</span><span class="nf">isoformat</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">_orbit_cache</span><span class="p">[</span><span class="sh">"</span><span class="s">key</span><span class="sh">"</span><span class="p">]</span> <span class="o">!=</span> <span class="n">key</span><span class="p">:</span>
            <span class="n">_orbit_cache</span><span class="p">[</span><span class="sh">"</span><span class="s">result</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="nf">compute_orbit</span><span class="p">(</span><span class="n">ref_dt</span><span class="p">)</span>
            <span class="n">_orbit_cache</span><span class="p">[</span><span class="sh">"</span><span class="s">key</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span>
        <span class="k">return</span> <span class="n">_orbit_cache</span><span class="p">[</span><span class="sh">"</span><span class="s">result</span><span class="sh">"</span><span class="p">]</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">orbit endpoint failed, returning fallback: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="nf">_fallback_orbit</span><span class="p">()</span>
</code></pre>

</div>



<p><code>_fallback_orbit()</code> returns a well-formed response with the marker parked over Sheffield and a short straight track. The globe still renders; the user sees the site; the CORS headers are present because FastAPI returned normally. The same philosophy runs through the stack: <code>latest-scene</code> falls back to a <code>null</code> cloud cover, <code>get_latest_scene_meta</code> returns <code>None</code> instead of throwing, and the TLE fetch has a hardcoded backup. <strong>Every external dependency has a graceful degradation path</strong>, because in a live dashboard "slightly stale but rendered" always beats "broken."</p>




<h3>
  
  
  Keeping it light: caching
</h3>

<p>Two small caches keep the Render instance from re-doing expensive work on every poll. Catalog metadata is cached for 30 minutes — new Sentinel-2 scenes don't appear more often than that, so hammering the Catalog API on every request buys nothing. And the orbit is recomputed <strong>only when the newest scene actually changes</strong>, keyed on the scene datetime:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight python"><code><span class="k">if</span> <span class="n">_orbit_cache</span><span class="p">[</span><span class="sh">"</span><span class="s">key</span><span class="sh">"</span><span class="p">]</span> <span class="o">!=</span> <span class="n">key</span><span class="p">:</span>
    <span class="n">_orbit_cache</span><span class="p">[</span><span class="sh">"</span><span class="s">result</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="nf">compute_orbit</span><span class="p">(</span><span class="n">ref_dt</span><span class="p">)</span>
    <span class="n">_orbit_cache</span><span class="p">[</span><span class="sh">"</span><span class="s">key</span><span class="sh">"</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span>
</code></pre>

</div>



<p>Since the scene changes every few days but the frontend polls every five minutes, this turns thousands of SGP4 computations per day into a handful. The coarse+fine orbit search is cheap in isolation, but not free at 512×512-plus-thousands-of-samples on every poll from every visitor; keying the cache to the <em>scene</em> rather than a clock interval means the work happens exactly when the underlying data does, and never otherwise.</p>




<h3>
  
  
  Takeaways
</h3>

<ol>
<li>
<strong>A backend earns its place as a credential boundary.</strong> The moment you need an API secret, the browser can't be trusted with it — the backend holds the OAuth handshake and proxies the data. That's the honest reason this isn't a pure frontend app.</li>
<li>
<strong>"Latest" is a query, not a timestamp.</strong> For real observational data, the newest <em>usable</em> record — under a cloud threshold, within a lookback window — is something you look up and then anchor everything else to, so your views stay self-consistent.</li>
<li>
<strong>Push computation to the data.</strong> Sentinel Hub evalscripts compute NDVI at the source and return a finished PNG; you move a picture, not gigabytes of raw bands.</li>
<li>
<strong>Vectorize the physics.</strong> Skyfield + NumPy evaluate an orbit at thousands of times in a couple of calls. A coarse-then-fine search over those arrays finds an exact closest approach without a Python loop in sight.</li>
<li>
<strong>In a live dashboard, always return valid JSON.</strong> Every third-party call gets a graceful fallback, partly for UX and partly because a raised exception can strip your CORS headers and turn a hiccup into a cross-origin error.</li>
<li>
<strong>Cache to the data's own rhythm.</strong> Key expensive work to the thing that actually changes (the scene) rather than a fixed interval, and recompute exactly when — and only when — reality does.</li>
</ol>

<p>The satellite-data pipeline is the part I'd point anyone to first: authenticate, find the real newest scene, compute vegetation at the source, then turn a live TLE into an exact position in orbit — each step tied to the same acquisition so the whole globe tells one true, consistent story about one small patch of Sheffield.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[From git push to Fine-Tuned Model in Production]]></title>
<description><![CDATA[At some point in every engineer's life, they sit down and think: "You know what this fine-tuning pipeline needs? More YAML." That moment arrived for me, and the result is nebius-actions — a set of composable GitHub Actions that let you train, deploy, and smoke-test a model on Nebius AI Cloud GPU ...]]></description>
<link>https://tsecurity.de/de/3666561/sichere-programmierung/from-git-push-to-fine-tuned-model-in-production/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3666561/sichere-programmierung/from-git-push-to-fine-tuned-model-in-production/</guid>
<pubDate>Tue, 14 Jul 2026 00:56:30 +0200</pubDate>
<content:encoded><![CDATA[<p>At some point in every engineer's life, they sit down and think: <em>"You know what this fine-tuning pipeline needs? More YAML."</em> That moment arrived for me, and the result is <a href="https://tsecurity.de/weiterlesen/3638420/3666561/from-git-push-to-fine-tuned-model-in-production/" target="_blank" rel="noopener noreferrer"><code>nebius-actions</code></a> — a set of composable GitHub Actions that let you train, deploy, and smoke-test a model on <a href="https://tsecurity.de/weiterlesen/3638420/3666561/from-git-push-to-fine-tuned-model-in-production/" target="_blank" rel="noopener noreferrer">Nebius AI Cloud</a> GPU infrastructure, entirely from a GitHub workflow.</p>




<h2>
  
  
  The Idea
</h2>

<p>I wanted one thing: click a button in GitHub, have a real GPU spin up, fine-tune a model, package it into a serving image, deploy it to a live endpoint, prove it works, and clean everything up — with zero manual steps and no leaked cloud resources. No Jupyter notebooks saved as "final_v3_REAL.ipynb". No SSH-ing into a VM to babysit training. Just a workflow that does the whole thing and gets out of your way.</p>

<p>The result is demo-run-job.yml: it QLoRA-fine-tunes Qwen2.5-0.5B on wikitext for 30 steps with Axolotl, bakes the LoRA adapters into a vLLM serving image, deploys it to a Nebius Endpoint, and smoke-tests it — all triggered by a single workflow_dispatch click.</p>

<p>The pipeline runs across five GitHub jobs: submit, wait, deploy, try, and cleanup. State that must cross job boundaries — bucket name, image ref, job ID, endpoint URL — travels as job outputs. </p>




<h2>
  
  
  The Five Acts of This Drama
</h2>

<h3>
  
  
  Act 1 — <code>submit</code>: Everything Happens Here
</h3>

<p>The <code>submit</code> job is where the magic (and most of the YAML) lives. It:</p>

<ol>
<li>Writes an <strong>Axolotl config inline</strong> — the workflow is the single source of truth. No external config file to lose.</li>
<li>Writes a <strong><code>train-and-push.sh</code> script inline</strong> — yes, a full Bash script, heredoc'd into the workflow. It fine-tunes with Axolotl, packages the adapters into a tar layer, installs <code>crane</code> (a daemonless container registry client, because the GPU job has no Docker daemon), and pushes <code>vllm/vllm-openai:latest</code> + the adapter layer to the Nebius Container Registry.</li>
<li>Provisions a <strong>fresh S3 bucket per run</strong>, uploads both files, and creates the Nebius Job. </li>
</ol>

<p>The auth story is pleasantly clean: a <code>setup</code> action configures a key-based CLI profile, and an <code>auth</code> action mints a short-lived <code>NEBIUS_IAM_TOKEN</code> for the SDK path. No long-lived credentials sitting in your repo — just a token that expires before you finish reading this post.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight yaml"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Submit fine-tune + image push</span>
  <span class="na">id</span><span class="pi">:</span> <span class="s">submit</span>
  <span class="na">uses</span><span class="pi">:</span> <span class="s">./actions/submit-job</span>
  <span class="na">with</span><span class="pi">:</span>
    <span class="na">name</span><span class="pi">:</span> <span class="s">demo-axolotl-${{ github.run_id }}</span>
    <span class="na">image</span><span class="pi">:</span> <span class="s">${{ vars.NEBIUS_JOB_IMAGE || 'docker.io/axolotlai/axolotl:main-20260309-py3.11-cu128-2.9.1' }}</span>
    <span class="na">platform</span><span class="pi">:</span> <span class="s">${{ inputs.platform }}</span>
    <span class="na">preset</span><span class="pi">:</span> <span class="s">${{ inputs.preset }}</span>
    <span class="na">command</span><span class="pi">:</span> <span class="s">bash</span>
    <span class="na">timeout</span><span class="pi">:</span> <span class="s">1h</span>
    <span class="na">env</span><span class="pi">:</span> <span class="pi">|</span>
      <span class="s">BASE_IMAGE=${{ vars.NEBIUS_VLLM_IMAGE || 'docker.io/vllm/vllm-openai:latest' }}</span>
      <span class="s">IMAGE=${{ steps.image.outputs.image }}</span>
      <span class="s">REGISTRY=${{ steps.image.outputs.registry }}</span>
      <span class="s">REGISTRY_TOKEN=${{ env.NEBIUS_IAM_TOKEN }}</span>
    <span class="na">mounts</span><span class="pi">:</span> <span class="s">${{ steps.bucket.outputs.bucket-id }}:/workspace/data:rw</span>
    <span class="na">disk-size</span><span class="pi">:</span> <span class="s">${{ inputs.disk-size }}</span>
    <span class="na">preemptible</span><span class="pi">:</span> <span class="kc">true</span>
    <span class="na">args</span><span class="pi">:</span> <span class="s">-c "bash /workspace/data/train-and-push.sh"</span>
</code></pre>

</div>



<h3>
  
  
  Act 2 — <code>wait</code>: The Anxious Polling Phase
</h3>

<p>This job does one thing: stream the GPU job's logs and poll it to a terminal state. It also handles a subtle but expensive problem — if you cancel the GitHub workflow, the Nebius Job keeps running (and keeps billing you) unless you explicitly forward the cancellation:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight yaml"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Wait for fine-tune + image push</span>
  <span class="na">id</span><span class="pi">:</span> <span class="s">wait</span>
  <span class="na">uses</span><span class="pi">:</span> <span class="s">./actions/wait-for-job</span>
  <span class="na">with</span><span class="pi">:</span>
    <span class="na">job-id</span><span class="pi">:</span> <span class="s">${{ needs.submit.outputs.job-id }}</span>
    <span class="na">stream-logs</span><span class="pi">:</span> <span class="kc">true</span>
    <span class="na">poll-interval</span><span class="pi">:</span> <span class="m">10</span>
    <span class="na">timeout</span><span class="pi">:</span> <span class="m">3600</span>

<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Cancel job on workflow cancellation</span>
  <span class="na">if</span><span class="pi">:</span> <span class="s">cancelled() &amp;&amp; needs.submit.outputs.job-id != ''</span>
  <span class="na">uses</span><span class="pi">:</span> <span class="s">./actions/cancel-job</span>
  <span class="na">with</span><span class="pi">:</span>
    <span class="na">job-id</span><span class="pi">:</span> <span class="s">${{ needs.submit.outputs.job-id }}</span>
</code></pre>

</div>



<p>That <code>if: cancelled()</code> guard has saved me from some spicy cloud bills.</p>

<h3>
  
  
  Act 3 — <code>deploy</code>: It Lives
</h3>

<p>Once <code>wait</code> confirms the job succeeded — meaning the vLLM image with baked-in adapters is in the registry — <code>deploy</code> creates a Nebius Endpoint and polls it to serving. <code>wait: false</code> is intentional: it means the endpoint ID is published even if the endpoint never becomes ready, which lets <code>cleanup</code> tear it down safely regardless.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight yaml"><code><span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Deploy endpoint</span>
  <span class="na">id</span><span class="pi">:</span> <span class="s">deploy</span>
  <span class="na">uses</span><span class="pi">:</span> <span class="s">./actions/deploy-endpoint</span>
  <span class="na">with</span><span class="pi">:</span>
    <span class="na">name</span><span class="pi">:</span> <span class="s">demo-axolotl-${{ github.run_id }}</span>
    <span class="na">image</span><span class="pi">:</span> <span class="s">${{ needs.submit.outputs.image }}</span>
    <span class="na">port</span><span class="pi">:</span> <span class="m">8000</span>
    <span class="na">public</span><span class="pi">:</span> <span class="kc">true</span>
    <span class="na">preset</span><span class="pi">:</span> <span class="s">${{ inputs.endpoint-preset }}</span>
    <span class="na">platform</span><span class="pi">:</span> <span class="s">${{ inputs.endpoint-platform }}</span>
    <span class="na">disk-size</span><span class="pi">:</span> <span class="s">${{ inputs.endpoint-disk-size }}</span>
    <span class="na">project-id</span><span class="pi">:</span> <span class="s">${{ vars.NEBIUS_PROJECT_ID }}</span>
    <span class="na">wait</span><span class="pi">:</span> <span class="kc">false</span>

<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Wait for endpoint</span>
  <span class="na">id</span><span class="pi">:</span> <span class="s">endpoint</span>
  <span class="na">uses</span><span class="pi">:</span> <span class="s">./actions/wait-for-endpoint</span>
  <span class="na">with</span><span class="pi">:</span>
    <span class="na">endpoint-id</span><span class="pi">:</span> <span class="s">${{ steps.deploy.outputs.endpoint-id }}</span>
    <span class="na">poll-interval</span><span class="pi">:</span> <span class="m">10</span>
    <span class="na">timeout</span><span class="pi">:</span> <span class="m">1800</span>
</code></pre>

</div>



<h3>
  
  
  Act 4 — <code>try</code>: Does It Actually Work?
</h3>

<p>The smoke test is beautifully minimal:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>curl <span class="nt">-fsS</span> <span class="nt">--retry</span> 30 <span class="nt">--retry-delay</span> 10 <span class="s2">"</span><span class="nv">$URL</span><span class="s2">/health"</span>
curl <span class="nt">-fsS</span> <span class="nt">-X</span> POST <span class="s2">"</span><span class="nv">$URL</span><span class="s2">/v1/completions"</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="se">\</span>
  <span class="nt">-d</span> <span class="s1">'{"model": "demo", "prompt": "The quick brown fox", "max_tokens": 16}'</span>
</code></pre>

</div>



<p><code>demo</code> is the <code>--lora-modules</code> name that <code>train-and-push.sh</code> baked into the image entrypoint. You fine-tuned it, you named it, now you serve it. Deeply personal.</p>

<h3>
  
  
  Act 5 — <code>cleanup</code>: <code>if: always()</code>
</h3>

<p>The cleanup job has <code>needs</code> on all four upstream jobs and — critically — <code>if: always()</code>. This is the move that separates people who have been surprised by a $200 cloud bill from people who haven't:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight yaml"><code><span class="na">cleanup</span><span class="pi">:</span>
  <span class="na">needs</span><span class="pi">:</span> <span class="pi">[</span><span class="nv">submit</span><span class="pi">,</span> <span class="nv">wait</span><span class="pi">,</span> <span class="nv">deploy</span><span class="pi">,</span> <span class="nv">try</span><span class="pi">]</span>
  <span class="na">if</span><span class="pi">:</span> <span class="s">always()</span>
  <span class="na">steps</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Delete endpoint</span>
      <span class="na">if</span><span class="pi">:</span> <span class="s">needs.deploy.outputs.endpoint-id != ''</span>
      <span class="na">uses</span><span class="pi">:</span> <span class="s">./actions/delete-endpoint</span>
      <span class="na">with</span><span class="pi">:</span>
        <span class="na">endpoint-id</span><span class="pi">:</span> <span class="s">${{ needs.deploy.outputs.endpoint-id }}</span>

    <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">Delete bucket</span>
      <span class="na">if</span><span class="pi">:</span> <span class="s">needs.submit.outputs.bucket-id != ''</span>
      <span class="na">uses</span><span class="pi">:</span> <span class="s">./actions/delete-bucket</span>
      <span class="na">with</span><span class="pi">:</span>
        <span class="na">bucket</span><span class="pi">:</span> <span class="s">${{ needs.submit.outputs.bucket-name }}</span>
        <span class="na">bucket-id</span><span class="pi">:</span> <span class="s">${{ needs.submit.outputs.bucket-id }}</span>
</code></pre>

</div>



<p>Endpoint dies. Bucket dies. The pushed image stays in the registry, tagged with the run ID, ready to be redeployed. Responsible MLOps.</p>




<h2>
  
  
  The Actions Themselves
</h2>

<p>The reusable building blocks are small and composable. The key ones: </p>

<ul>
<li>
<strong><code>setup</code></strong> — installs the <code>nebius</code> CLI, configures a key-based profile, exports <code>NEBIUS_PROJECT_ID</code> and <code>NEBIUS_SERVICE_ACCOUNT_ID</code> for downstream steps.</li>
<li>
<strong><code>auth</code></strong> — mints a short-lived IAM token via OIDC (keyless, recommended) or a service-account key.</li>
<li>
<strong><code>submit-job</code></strong> + <strong><code>wait-for-job</code></strong> — decoupled create and poll, so you can fan out or gate between them.</li>
<li>
<strong><code>deploy-endpoint</code></strong> + <strong><code>wait-for-endpoint</code></strong> + <strong><code>delete-endpoint</code></strong> — the full endpoint lifecycle.</li>
<li>
<strong><code>create-bucket</code></strong>, <strong><code>upload-object</code></strong>, <strong><code>delete-bucket</code></strong> — the storage trio, all using short-lived S3 keys minted on the fly, no stored S3 credentials required. </li>
</ul>

<p>The design philosophy: one action per resource, no hidden orchestration, no magic. If you want a rigid pipeline, the demo is there. If you want to mix and match — say, fine-tune in one workflow and deploy in another — the primitives are waiting.</p>




<h2>
  
  
  Try It Yourself
</h2>

<p>The repo is at <a href="https://tsecurity.de/weiterlesen/3638420/3666561/from-git-push-to-fine-tuned-model-in-production/" target="_blank" rel="noopener noreferrer">github.com/piotrjanik/nebius-actions</a>. You'll need a Nebius project, a service account with <code>ai.editor</code> role, and the patience to fill in five repo variables and one secret. The README has the exact <code>nebius iam</code> commands to set it all up. </p>

<p>Then click <strong>Run workflow</strong>, pick your GPU preset, and watch a 500M-parameter model get fine-tuned and deployed while you make coffee. That's the dream. That's the YAML.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Hungry? We talk Smoked Meat, Poutine, and Bagel - also, Identiverse Interviews! - John Pritchard, Cassie Christensen, Jaime Lewis-Gross, François Proulx, Kim Brown - ESW #467]]></title>
<description><![CDATA[Interview with François Proulx from Boost Security Software Supply Chain Security: Build Pipeline (CI/CD) Exploitation Boost Security is the creator of some very popular build pipeline security tools, like Bagel and Poutine. Today, we discuss their latest tool, Smoked Meat. They describe it as "L...]]></description>
<link>https://tsecurity.de/de/3664752/it-security-nachrichten/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-john-pritchard-cassie-christensen-jaime-lewis-gross-franois-proulx-kim-brown-esw-467/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3664752/it-security-nachrichten/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-john-pritchard-cassie-christensen-jaime-lewis-gross-franois-proulx-kim-brown-esw-467/</guid>
<pubDate>Mon, 13 Jul 2026 11:21:15 +0200</pubDate>
<content:encoded><![CDATA[<h3>Interview with François Proulx from Boost Security</h3> <p><strong>Software Supply Chain Security: Build Pipeline (CI/CD) Exploitation</strong></p> <p>Boost Security is the creator of some very popular build pipeline security tools, like Bagel and Poutine. Today, we discuss their latest tool, Smoked Meat. They describe it as "Like Metasploit, but for CI/CD pipelines".</p> <p>Segment Resources:</p> <ul> <li>Smoked Meat <a href="https://tsecurity.de/weiterlesen/3636611/3664752/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-john-pritchard-cassie-christensen-jaime-lewis-gross-franois-proulx-kim-brown-esw-467/" target="_blank" rel="noopener noreferrer">announcement</a></li> <li>Smoked Meat <a href="https://tsecurity.de/weiterlesen/3636611/3664752/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-john-pritchard-cassie-christensen-jaime-lewis-gross-franois-proulx-kim-brown-esw-467/" target="_blank" rel="noopener noreferrer">github</a></li> <li>Smoked <a href="https://tsecurity.de/weiterlesen/3636611/3664752/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-john-pritchard-cassie-christensen-jaime-lewis-gross-franois-proulx-kim-brown-esw-467/" target="_blank" rel="noopener noreferrer">Meat demo</a> with Guillaume and François</li> </ul> <h3>Identiverse Interview with Dr. John Prichard from Radiant Logic</h3> <p><strong>The Three Identity Problem: Surviving Identity Security's Chaotic Era</strong></p> <p>Identity security has entered its chaotic era. Human, non-human, and agentic AI identities no longer just coexist. They form an uncontrolled inheritance chain in which a human creates an agent, the agent spins up service principals, OAuth grants, and role assignments, and that whole chain keeps running long after the human changes roles or leaves. Most of these chains are being spawned by business users on low-code and enterprise AI platforms, outside traditional identity controls and largely invisible to security.</p> <p>In this segment, Radiant Logic CEO Dr. John Pritchard joins us to unpack why this is no longer a visibility problem. It is an observability problem. And it is shifting the center of gravity in identity security from authentication to authorization. Listeners will leave with a clearer view of where their current IAM, IGA, and NHI programs fall short, and a practical lens for governing the rapidly expanding population of AI agents already inside their environments.</p> <p>To go deeper on what John discussed today, watch Radiant Logic's on-demand webinar Identities Under Attack: How Adversaries Exploit the Human-Machine-Agent Divide at <a href="https://tsecurity.de/weiterlesen/3636611/3664752/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-john-pritchard-cassie-christensen-jaime-lewis-gross-franois-proulx-kim-brown-esw-467/" target="_blank" rel="noopener noreferrer">https://securityweekly.com/radiantlogicidv</a>.</p> <h3>Identiverse Interview with Cassie Christensen from Saviynt</h3> <p><strong>Everyone Wants an AI Assistant. Few Are Ready to Govern One</strong></p> <p>Explore a growing reality many professionals can relate to: the appeal of using AI agents to handle the work that keeps piling up - from inbox management to research and logistics - and the governance challenges that quickly follow. The real barrier to scaling personal or enterprise AI agents isn't the technology itself, but defining clear roles, access boundaries, oversight, and lifecycle management. As organizations deploy more autonomous AI agents, the same identity frameworks used to govern workforce and non-employee identities must now evolve to manage AI-driven access before scale and risk outpace control.</p> <p>This segment is sponsored by Saviynt. Learn more or get a free demo at <a href="https://tsecurity.de/weiterlesen/3636611/3664752/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-john-pritchard-cassie-christensen-jaime-lewis-gross-franois-proulx-kim-brown-esw-467/" target="_blank" rel="noopener noreferrer">https://securityweekly.com/saviyntidv</a></p> <h3>Identiverse Interview with Jaime Lewis-Gross from Saviynt</h3> <p><strong>From Sales Engineer to Forward Deployed Engineer: The Rise of Hybrid Technical Roles</strong></p> <p>As technology organizations evolve, technical roles are becoming increasingly fluid - particularly at the intersection of product, engineering, and customer success. This conversation explores what it means to be a modern sales engineer and how the role is increasingly expanding into responsibilities often associated with forward deployed engineers: translating complex technical capabilities into real-world outcomes, solving customer challenges in real time, and serving as a critical bridge between product teams and end users. At the center of this evolution is a customer-first mindset - one that prioritizes listening, adaptability, and long-term partnership. As organizations race to innovate, the companies that stand out will be those that remain deeply focused on customer needs while empowering technical teams to operate beyond traditional role boundaries.</p> <p>This segment is sponsored by Saviynt. Learn more or get a free demo at <a href="https://tsecurity.de/weiterlesen/3636611/3664752/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-john-pritchard-cassie-christensen-jaime-lewis-gross-franois-proulx-kim-brown-esw-467/" target="_blank" rel="noopener noreferrer">https://securityweekly.com/saviyntidv</a></p> <h3>Identiverse Interview with Kim Brown from LexisNexis</h3> <p><strong>Stop Identity Fraud: Modern Strategies for Insurance and Healthcare</strong></p> <p>Identity fraud is growing more sophisticated across both insurance and healthcare, making identity management a critical line of defense. In this executive interview, Kim Brown, VP of Product Management, will explore how organizations can strengthen identity verification, authentication, and risk assessment to reduce fraud while improving user experiences. The discussion will highlight emerging threats, evolving regulatory expectations, and practical strategies for deploying identity solutions at scale. Attendees will gain actionable insights to protect customers, patients, and their organizations without adding friction.</p> <p>This segment is sponsored by LexisNexis Risk Solutions. Visit <a href="https://tsecurity.de/weiterlesen/3636611/3664752/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-john-pritchard-cassie-christensen-jaime-lewis-gross-franois-proulx-kim-brown-esw-467/" target="_blank" rel="noopener noreferrer">https://securityweekly.com/lexisnexisidv</a> to learn more about them!</p> <p>Visit <a href="https://tsecurity.de/weiterlesen/3636611/3664752/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-john-pritchard-cassie-christensen-jaime-lewis-gross-franois-proulx-kim-brown-esw-467/" target="_blank" rel="noopener noreferrer">https://www.securityweekly.com/esw</a> for all the latest episodes!</p> <p>Show Notes: <a href="https://tsecurity.de/weiterlesen/3636611/3664752/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-john-pritchard-cassie-christensen-jaime-lewis-gross-franois-proulx-kim-brown-esw-467/" target="_blank" rel="noopener noreferrer">https://securityweekly.com/esw-467</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Hungry? We talk Smoked Meat, Poutine, and Bagel - also, Identiverse Interviews! - ESW #467]]></title>
<description><![CDATA[Author: Security Weekly - A CRA Resource - Bewertung: 1x - Views:2 Interview with François Proulx from Boost Security

Software Supply Chain Security: Build Pipeline (CI/CD) Exploitation

Boost Security is the creator of some very popular build pipeline security tools, like Bagel and Poutine....]]></description>
<link>https://tsecurity.de/de/3664747/it-security-video/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-esw-467/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3664747/it-security-video/hungry-we-talk-smoked-meat-poutine-and-bagel-also-identiverse-interviews-esw-467/</guid>
<pubDate>Mon, 13 Jul 2026 11:17:45 +0200</pubDate>
<content:encoded><![CDATA[<p>Author: Security Weekly - A CRA Resource - Bewertung: 1x - Views:2 <br/></p><p><iframe id="ytplayer" loading="lazy" type="text/html" width="100%" height="auto" src="https://www.youtube.com/embed/ywJwPPIWDOU?autoplay=1&origin=http://tsecurity.de" frameborder="0"></iframe></p><p>Interview with François Proulx from Boost Security<br />
<br />
Software Supply Chain Security: Build Pipeline (CI/CD) Exploitation<br />
<br />
Boost Security is the creator of some very popular build pipeline security tools, like Bagel and Poutine. Today, we discuss their latest tool, Smoked Meat. They describe it as "Like Metasploit, but for CI/CD pipelines".<br />
<br />
Segment Resources:<br />
- Smoked Meat announcement: https://labs.boostsecurity.io/articles/introducing-smokedmeat<br />
- Smoked Meat github: https://github.com/boostsecurityio/smokedmeat<br />
- Smoked Meat demo: https://www.youtube.com/watch?v=F5Hr_201Au8 with Guillaume and François<br />
<br />
Dr. John Prichard from Radiant Logic<br />
<br />
The Three Identity Problem: Surviving Identity Security's Chaotic Era<br />
<br />
Identity security has entered its chaotic era. Human, non-human, and agentic AI identities no longer just coexist. They form an uncontrolled inheritance chain in which a human creates an agent, the agent spins up service principals, OAuth grants, and role assignments, and that whole chain keeps running long after the human changes roles or leaves. Most of these chains are being spawned by business users on low-code and enterprise AI platforms, outside traditional identity controls and largely invisible to security.<br />
<br />
In this segment, Radiant Logic CEO Dr. John Pritchard joins us to unpack why this is no longer a visibility problem. It is an observability problem. And it is shifting the center of gravity in identity security from authentication to authorization. Listeners will leave with a clearer view of where their current IAM, IGA, and NHI programs fall short, and a practical lens for governing the rapidly expanding population of AI agents already inside their environments.<br />
<br />
To go deeper on what John discussed today, watch Radiant Logic's on-demand webinar Identities Under Attack: How Adversaries Exploit the Human-Machine-Agent Divide at https://securityweekly.com/radiantlogicidv.<br />
<br />
Cassie Christensen from Saviynt<br />
<br />
Everyone Wants an AI Assistant. Few Are Ready to Govern One<br />
<br />
Explore a growing reality many professionals can relate to: the appeal of using AI agents to handle the work that keeps piling up - from inbox management to research and logistics - and the governance challenges that quickly follow. The real barrier to scaling personal or enterprise AI agents isn’t the technology itself, but defining clear roles, access boundaries, oversight, and lifecycle management. As organizations deploy more autonomous AI agents, the same identity frameworks used to govern workforce and non-employee identities must now evolve to manage AI-driven access before scale and risk outpace control.<br />
<br />
This segment is sponsored by Saviynt. Learn more or get a free demo at https://securityweekly.com/saviyntidv<br />
<br />
Jaime Lewis-Gross from Saviynt<br />
<br />
From Sales Engineer to Forward Deployed Engineer: The Rise of Hybrid Technical Roles<br />
<br />
As technology organizations evolve, technical roles are becoming increasingly fluid - particularly at the intersection of product, engineering, and customer success. This conversation explores what it means to be a modern sales engineer and how the role is increasingly expanding into responsibilities often associated with forward deployed engineers: translating complex technical capabilities into real-world outcomes, solving customer challenges in real time, and serving as a critical bridge between product teams and end users. At the center of this evolution is a customer-first mindset - one that prioritizes listening, adaptability, and long-term partnership. As organizations race to innovate, the companies that stand out will be those that remain deeply focused on customer needs while empowering technical teams to operate beyond traditional role boundaries.<br />
<br />
This segment is sponsored by Saviynt. Learn more or get a free demo at https://securityweekly.com/saviyntidv<br />
<br />
Kim Brown from LexisNexis<br />
<br />
Stop Identity Fraud: Modern Strategies for Insurance and Healthcare<br />
<br />
Identity fraud is growing more sophisticated across both insurance and healthcare, making identity management a critical line of defense. In this executive interview, Kim Brown, VP of Product Management, will explore how organizations can strengthen identity verification, authentication, and risk assessment to reduce fraud while improving user experiences. The discussion will highlight emerging threats, evolving regulatory expectations, and practical strategies for deploying identity solutions at scale. Attendees will gain actionable insights to protect customers, patients, and their organizations without adding friction.<br />
<br />
This segment is sponsored by LexisNexis Risk Solutions. Visit https://securityweekly.com/lexisnexisidv to learn more about them!<br />
<br />
Visit https://www.securityweekly.com/esw for all the latest episodes!<br />
<br />
Show Notes: https://securityweekly.com/esw-467<br/></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[AI ROI 측정의 어려움, 글로벌 IT 리더는 이렇게 풀었다]]></title>
<description><![CDATA[덴마크의 다국적 제약사 노보 노디스크(Novo Nordisk)는 특허 만료 전에 신약을 최대한 빨리 시장에 출시하는 데 큰 관심을 두고 있다. 노보 노디스크의 디지털 혁신 책임자(CDTO) 스테파니 보바(Stephanie Bova)는 “대형 블록버스터 신약의 경우 출시가 일주일만 늦어져도 손실 규모가 1,000만~1억 달러(약 149억~1,494억 원)에 이를 수 있다”라며 “특허 보호 기간 동안 제품을 판매할 수 있는 시간이 그만큼 줄어들기 때문”이라고 설명했다.



생성형 AI는 신약 개발 과정의 여러 단계를 획기적으로 ...]]></description>
<link>https://tsecurity.de/de/3664639/it-nachrichten/ai-roi-it/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3664639/it-nachrichten/ai-roi-it/</guid>
<pubDate>Mon, 13 Jul 2026 10:32:38 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>



<p>덴마크의 다국적 제약사 노보 노디스크(Novo Nordisk)는 특허 만료 전에 신약을 최대한 빨리 시장에 출시하는 데 큰 관심을 두고 있다. 노보 노디스크의 디지털 혁신 책임자(CDTO) 스테파니 보바(Stephanie Bova)는 “대형 블록버스터 신약의 경우 출시가 일주일만 늦어져도 손실 규모가 1,000만~1억 달러(약 149억~1,494억 원)에 이를 수 있다”라며 “특허 보호 기간 동안 제품을 판매할 수 있는 시간이 그만큼 줄어들기 때문”이라고 설명했다.</p>



<p>생성형 AI는 신약 개발 과정의 여러 단계를 획기적으로 단축할 가능성을 제시했다. 특히 노보 노디스크는 핵심 업무 프로세스마다 소요 시간을 꾸준히 추적·관리해 왔기 때문에 다른 많은 기업보다 유리한 출발점에 있었다. 생성형 AI를 일부 업무에 적용하면 생산성이 향상되고, 곧바로 재무 성과로 이어질 것으로 기대할 수도 있었다. 하지만 현실은 그렇게 단순하지 않았다. 신약 개발은 여러 부서에서 다양한 업무가 서로 다른 시점에 진행되는 복잡한 과정이기 때문이다.</p>



<p>보바는 “각 담당자는 자신이 맡은 분야의 전문가이지만, 다음 단계의 업무나 전체 프로세스가 어떻게 연결되는지까지는 잘 알지 못하는 경우가 많다”라며 “시스템 자체가 워낙 크고 복잡해 전체 성과를 한눈에 파악하기 어렵다”라고 설명했다.</p>



<p>프로세스 문서에 기록된 내용과 실제 업무 방식이 일치하지 않는 경우도 적지 않다. 같은 업무를 담당자마다 서로 다른 방식으로 수행하기도 하며, 일부 핵심 업무는 외부에서 거의 드러나지 않는다. 예를 들어 생산팀은 완전히 다른 조직에 속해 있어 신약이 미국 식품의약국(FDA) 제출을 앞두고 있다는 사실조차 인지하지 못할 수 있다. 이 경우 필요한 문서도 아직 준비되지 않은 상태일 수 있다.</p>



<p>보바는 “앞 단계에서는 아무리 빠르게 업무를 진행해도 결국 다른 팀의 준비가 끝날 때까지 기다려야 하는 상황이 발생한다”라고 말했다.</p>



<p>이는 기업이 AI 프로젝트의 성과를 측정하는 과정에서 마주하는 여러 어려움 가운데 하나이며, AI 관련 설문조사 결과가 서로 엇갈리는 이유이기도 하다.</p>



<p>개별 업무 단위에서 보면 노보 노디스크는 AI 도입을 통해 생산성이 향상됐고, 분명한 효과도 확인하고 있다. 하지만 시야를 넓혀 기업 전체의 실적을 기준으로 평가하면 상황은 훨씬 복잡해진다. 중요한 단계 하나라도 누락되면 신약 출시 기간은 단축되지 않는다. 또한 신약이 실제 환자에게 공급되기까지는 수년이 걸리기 때문에 AI 도입에 따른 재무적 효과 역시 상당한 시간이 지나야 나타난다. 그리고 이는 <a href="https://tsecurity.de/weiterlesen/3636498/3664639/ai-roi-it/" target="_blank" rel="noopener noreferrer">AI 투자 수익률(ROI)을 측정</a>하기 어렵게 만드는 문제의 시작에 불과하다.</p>



<h2 class="wp-block-heading">프로세스 측정의 중요성</h2>



<p>이 같은 프로세스의 사각지대를 해소하기 위해 노보 노디스크는 차세대 프로세스 마이닝 기술인 AI 기반 실시간 운영 디지털 트윈을 도입했다.</p>



<p>보바는 “프로세스 인텔리전스 기업 셀로니스(Celonis)와 협력해 프로세스 데이터를 기반으로 한 디지털 트윈을 구축했다”라며 “임상 분야에 이 기술을 적용한 것은 업계 최초였다”라고 설명했다. 이 도구는 기업 시스템에서 데이터를 수집해 직원들이 실제로 어떤 업무를 수행하는지 추적한다. 일부 직원의 기억에 의존하는 설문조사 방식과 달리 실제 업무 흐름을 객관적으로 파악할 수 있다는 것이 특징이다.</p>



<p>첫 번째 적용 대상은 7단계로 구성된 비교적 단순한 프로세스였다. 하지만 디지털 트윈을 구축한 결과, 실제로는 담당자에 따라 5단계로 진행되기도 하고 9단계까지 늘어나기도 한다는 사실이 드러났다.</p>



<p>보바는 “동일한 업무 전문가 10명을 한자리에 모아도 프로세스에 대한 해석은 제각각이며, 시간이 지나면서 업무 방식도 조금씩 달라진다”라고 말했다.</p>



<p>프로젝트는 기존 프로세스의 여러 문제점도 찾아냈다. 일부 업무는 직원 재교육이 필요했고, 어떤 경우에는 사용자 인터페이스(UI)를 개선해야 했다. 하지만 일단 프로세스를 표준화하면 AI 도입 이전의 기준 데이터를 확보할 수 있다. 이를 기반으로 AI를 활용한 업무 지원이나 자동화가 실제 성과를 냈는지 객관적으로 비교·평가할 수 있다.</p>



<p>또 하나 미리 결정해야 했던 과제는 AI로 확보한 시간을 어떻게 활용할 것인지였다.</p>



<p>보바는 “사람을 감원하는 것은 바람직하지 않다”라며 “이들은 고도의 전문성을 갖춘 구하기 어려운 인재인 만큼, 팀 간 인력을 재배치하는 방안을 고려하는 편이 더 적절하다”라고 밝혔다.</p>



<p>현재 노보 노디스크는 수백 개의 AI 에이전트를 실제 업무에 운영하고 있다. 이들 에이전트는 모두 디지털 트윈 인프라 안에서 식별할 수 있도록 관리된다.</p>



<p>보바는 “문제가 발생하면 어디에서 오류가 생겼는지 정확히 파악해 바로 수정할 수 있다”라며 “다음 단계는 여러 AI 에이전트가 서로 협업하는 멀티 에이전트 오케스트레이션이다. 지금은 각각의 AI 에이전트가 연결돼 있지만, AI 에이전트를 관리하는 또 다른 AI 에이전트는 아직 없는 상태”라고 설명했다.</p>



<p>다만 신약 개발은 수년에 걸쳐 진행되는 만큼 아직 AI 투자 수익률(ROI)을 평가하기에는 이르다는 것이 보바의 설명이다.</p>



<p>보바는 “전체 프로세스를 종단간(end-to-end)으로 분석하면 불필요한 과정을 제거해 개발 기간을 2년 정도 단축할 수 있을 것으로 기대한다”라며 “현재보다 2년 더 빨리 시장에 제품을 출시하는 것이 목표”라고 말했다.</p>



<p>이미 임상 개발 막바지에 접어든 신약은 AI 도입에 따른 시간 단축 효과가 제한적이다. 반면 개발 초기 단계의 신약은 가장 큰 혜택을 받을 것으로 예상된다. 다만 이러한 성과가 기업의 재무 실적으로 이어지기까지는 앞으로 수년이 더 걸릴 전망이다.</p>



<p>이처럼 여러 프로세스를 동시에 최적화해야 진정한 가치를 얻을 수 있는 산업은 제약업계만이 아니다. <a href="https://tsecurity.de/weiterlesen/3636498/3664639/ai-roi-it/" target="_blank" rel="noopener noreferrer">PwC에 따르면</a> 단발성 AI 프로젝트는 측정 가능한 성과를 내지 못하는 경우가 많다. 반면 기업의 경영 전략과 연계된 전사적 규모의 AI 도입은 실질적인 투자 수익을 창출하는 것으로 나타났다.</p>



<p>실제로 AI 도입이 거의 보편화됐음에도 불구하고 지난 12개월 동안 AI를 통해 매출이 증가하거나 비용이 감소했다고 답한 기업은 많지 않았다. 그럼에도 KPMG는 올해 말 기업의 AI 투자 규모가 지난해보다 거의 두 배로 증가할 것으로 <a href="https://tsecurity.de/weiterlesen/3636498/3664639/ai-roi-it/" target="_blank" rel="noopener noreferrer">전망했다</a>.</p>



<h2 class="wp-block-heading">생산성 측정</h2>



<p>대부분의 기업은 비교적 작은 규모에서 AI 도입을 시작한다. 대표적인 사례가 직원 생산성 향상을 위한 AI 챗봇 도입이다. AI 챗봇은 놀라울 정도로 빠른 속도로 확산됐지만, 정작 기대했던 생산성 향상을 어떻게 측정해야 하는지는 여전히 쉽지 않은 과제로 남아 있다.</p>



<p>카네기멜런대학교 AI 교수 아난드 라오(Anand Rao)는 무엇보다 기준선(baseline)을 확보하는 것이 중요하다고 말한다. 하지만 어떤 업무는 기준선을 측정하기가 어렵고, 어떤 경우에는 사실상 불가능하다.</p>



<p>예를 들어 보험 심사는 결과가 나타나기까지 수년이 걸린다. 생명보험이라면 그 기간이 수십 년에 이를 수도 있다. 일부 의사결정은 애초에 성과를 측정할 기준 자체가 존재하지 않는다.</p>



<p>라오는 “사람의 의사결정 과정과 그 질을 평가하겠다고 하면 사회적 거부감이 생긴다”라며 “사람은 자신의 의사결정이 평가받는 것을 좋아하지 않는다”라고 설명했다.</p>



<p>이어 “결과가 좋으면 누구나 자신의 공이라고 말하지만, 결과가 나쁘면 외부 요인 때문이라고 생각하는 경향이 있다”라고 말했다.</p>



<p>측정이 가능한 업무라도 상황은 크게 다르지 않다. 많은 기업이 AI를 도입하기 전에 기존 성과를 측정하는 작업부터 하지 않는 경우가 많기 때문이다.</p>



<p>패션 소매업체 룰루레몬(Lululemon)의 전 글로벌 최고정보책임자(CIO)이자 수석부사장(EVP)을 지낸 줄리 애버릴(Julie Averill)은 “처음부터 기준선을 마련하지 않았다”라고 말했다. 현재 애버릴은 디지털 혁신 컨설팅 기업 골드 스레드(Gold Thread)의 CEO를 맡고 있다.</p>



<p>애버릴은 “AI가 더 나은 의사결정을 도와줄 것이라는 전제를 먼저 세우고 시작했다”라며 “그렇게 되면 이후 성과를 제대로 측정하기가 어려워진다”라고 설명했다.</p>



<p>물론 다른 지표를 활용할 수도 있다. 예를 들어 AI 사용률이나 사용자 만족도 같은 수치다.</p>



<p>애버릴은 “AI는 실제로 활용되고 있고 다양한 이점을 만들어내고 있다”라며 “눈에 보이는 효과도 있지만 그렇지 않은 효과도 있다. 결국 프로세스를 믿어야 한다”라고 말했다.</p>



<p>이어 “이는 클라우드 도입과 비슷하다. 모두가 미래의 방향이라는 사실은 알고 있고 장점도 이해하지만, 실제로 전환하기는 쉽지 않으며 조직 전반에 많은 변화가 필요하다”라며 “하지만 전환을 빨리 시작할수록 새로운 운영 방식에 더 빨리 적응하고 AI의 가치를 제대로 활용할 수 있다”라고 설명했다.</p>



<p>반면 고객 서비스처럼 성과를 수치로 측정하기 쉬운 영역도 있다.</p>



<p>애버릴은 “고객 서비스는 반복적인 업무가 많아 기업이 AI 자동화를 가장 먼저 적용하는 분야”라며 “측정 가능한 결과가 분명하고 기준선도 비교적 쉽게 설정할 수 있다”라고 말했다.</p>



<p>룰루레몬은 개인화 추천 시스템에도 수년간 AI를 활용해 왔다. 이 역시 성과를 정량적으로 측정할 수 있는 분야다. 또한 AI는 수작업 데이터 입력을 자동화해 오류율을 낮출 수 있으며, 규정 준수 모니터링과 사기 탐지, 설비 예지보전(Predictive Maintenance) 등에서도 활용되고 있다. 이러한 분야는 모두 AI 효과를 수치로 평가할 수 있다.</p>



<p>하지만 직원 생산성 전반을 측정하는 일은 룰루레몬뿐 아니라 대부분의 기업에 여전히 어려운 과제다.</p>



<p>가장 직관적인 방법은 AI의 영향을 많이 받는 직종에서 실제 해고가 늘어났는지를 살펴보는 것이다. AI 때문에 일자리가 줄어든다는 보도는 이미 넘쳐난다.</p>



<p>그러나 올해 3월 공개된 <a href="https://tsecurity.de/weiterlesen/3636498/3664639/ai-roi-it/" target="_blank" rel="noopener noreferrer">앤트로픽 보고서</a>는 다른 결과를 제시했다. AI의 영향을 가장 크게 받는 직종, 즉 AI로 인해 해고 가능성이 가장 높은 직군에서도 실업 증가를 보여주는 증거는 발견되지 않았다.</p>



<p>2025년 초에는 연구기관 METR이 숙련된 소프트웨어 개발자를 대상으로 AI 사용 여부에 따른 업무 수행 속도를 비교하는 실험을 진행했다.</p>



<p>결과는 예상과 달랐다. 개발자들은 AI를 사용하면 생산성이 24% 정도 향상될 것으로 기대했고, 실제 체감 효과도 약 20%라고 평가했다. 하지만 실측 데이터는 정반대였다. AI를 사용한 경우 오히려 작업 속도가 평균 19% 느려진 것으로 나타났다.</p>



<p>물론 AI 도구는 빠르게 발전하고 있다. METR은 AI 사용 여부를 다시 비교하는 후속 연구를 추진했지만 충분한 참가자를 모집하지 못했다. 연구 참여 비용을 지급했음에도 AI 없이 작업하는 방식으로 돌아가려는 개발자가 거의 없었기 때문이다.</p>



<p>물론 AI 덕분에 한 명의 엔지니어가 수백 명의 업무를 수행했다는 사례도 심심치 않게 들린다. 클로드 코드의 50만 줄 규모 코드베이스가 실수로 유출됐을 당시 한국인 개발자 시그리드 진(Sigrid Jin)이 클린룸 방식(원본 코드를 직접 복사하거나 참고하지 않고, 동일한 기능을 새롭게 구현하는 개발 방식)으로 이를 2시간 만에 재구현한 뒤 <a href="https://tsecurity.de/weiterlesen/3636498/3664639/ai-roi-it/" target="_blank" rel="noopener noreferrer">깃허브에 공개</a>했고, 해당 프로젝트가 역대 가장 빠르게 별 10만 개를 달성했다는 사례도 있다.</p>



<p>하지만 AI와 관련된 대부분의 이야기처럼 실제 상황은 훨씬 복잡하다. 특히 소프트웨어 개발에서는 코드를 작성하는 일 자체가 전체 개발 과정에서 차지하는 비중은 일부에 불과하다.</p>



<p>리서치 기관 DX가 400개 기업의 핵심 엔지니어링 지표를 분석한 <a href="https://tsecurity.de/weiterlesen/3636498/3664639/ai-roi-it/" target="_blank" rel="noopener noreferrer">보고서에 따르면</a> AI 활용률은 2024년 11월 이후 65% 증가했다. 그러나 AI로 인한 생산성 향상은 10%에도 미치지 못한 것으로 나타났다.</p>



<h2 class="wp-block-heading">AI의 숨은 비용</h2>



<p>AI의 생산성 향상을 측정하기 어려운 것처럼 AI 도입 비용을 정확하게 산정하는 일도 쉽지 않다. 기업이 AI를 처음 도입할 때는 비용을 비교적 간단하게 계산할 수 있다. 직원들이 사용하는 AI 챗봇의 월 구독료는 얼마인지, 맞춤형 모델을 학습하거나 파인튜닝하는 데 얼마나 드는지만 계산하면 되기 때문이다. 하지만 활용 사례가 복잡해질수록 비용 산정도 훨씬 어려워진다고 애버릴은 설명했다.</p>



<p>애버릴은 “이제는 AI 자체뿐 아니라 AI를 둘러싼 다양한 시스템까지 고려해야 한다”라며 “이런 비용은 측정하기는 더 어렵지만 기업에 미치는 영향은 훨씬 크다”라고 말했다.</p>



<p>예를 들어 RAG을 활용해 AI를 업무 프로세스에 통합하면 LLM API 호출 비용이 지속적으로 발생한다. 여기에 기존 시스템을 연동하거나 수정하는 비용까지 추가된다. 이러한 비용 구조는 시간이 갈수록 더욱 복잡해지고 있다.</p>



<p>KPMG의 글로벌 AI·데이터 랩 총괄인 스와미나탄 찬드라세카란(Swaminathan Chandrasekaran)은 “기업들은 지금까지 AI 사용 현황을 체계적으로 수집·분석할 수 있는 텔레메트리와 계측 체계를 구축하는 데 충분한 노력을 기울이지 않았다”라고 말했다. 기업 전체의 AI 비용을 정확히 파악하는 일은 마치 날씨를 예측하는 것과 비슷하다는 설명이다.</p>



<p>그는 “오늘날 정확한 기상 예보가 가능한 이유는 수만 개의 기상관측소가 데이터를 수집하고 이를 종합하기 때문”이라며 “그런 데이터가 없다면 날씨를 예측할 수 없을 것”이라고 설명했다.</p>



<p>기업도 AI 활용 전반을 측정할 수 있는 계측 체계를 구축해야 한다는 것이 그의 주장이다. 얼마나 많은 토큰을 사용했는지, 누가 사용했는지, 그리고 그 사용량이 실제 업무 성과와 어떤 관계가 있는지까지 추적해야 한다는 것이다.</p>



<p>찬드라세카란은 “현재는 이러한 측정 체계가 근본적으로 부족한 상황”이라고 지적했다.</p>



<p>직원이 AI 챗봇을 사용하는 경우에는 그나마 비용을 예측하기 쉽다. 사람이 하루에 입력할 수 있는 질문 수에는 물리적인 한계가 있고 구독료도 비교적 일정하기 때문이다. 또한 RAG를 적용한 업무 시스템에서는 기존의 규칙 기반 시스템이 예측 가능한 방식으로 LLM API를 호출한다.</p>



<p>하지만 에이전틱 AI가 등장하면서 상황은 훨씬 복잡해졌다. AI 에이전트는 예측하기 어려운 방식으로 자율적으로 행동하기 때문에 API 호출 횟수가 급격히 늘어날 수 있다. <a href="https://tsecurity.de/weiterlesen/3636498/3664639/ai-roi-it/" target="_blank" rel="noopener noreferrer">보스턴컨설팅그룹(BCG) 보고서</a>에 따르면 기업의 약 3분의 2는 AI 확장에 따른 비용이 통제하기 어려운 수준으로 증가하고 있다고 답했다.</p>



<p>기업이 간과하기 쉬운 또 다른 비용은 데이터 관련 비용이다. 다른 예산 항목에 포함돼 있다는 이유로 제대로 추적하지 않는 경우도 많다. AI 학습이나 파인튜닝을 위한 데이터 준비, RAG 임베딩 구축, AI 에이전트를 통한 MCP 직접 연동 등은 모두 상당한 비용을 수반하며, AI 도입이 확대될수록 이러한 비용은 빠르게 증가할 수 있다.</p>



<p>컨설팅 업체 코글린 어소시에이츠(Coughlin Associates)의 대표이자 IEEE 펠로인 톰 코글린(Tom Coughlin)은 “대표적인 비용 가운데 하나가 데이터 반출(egress) 비용”이라며 “클라우드에서 데이터를 꺼내와야 하는 경우 데이터 반출 수수료가 상당한 수준까지 늘어날 수 있다”라고 설명했다.</p>



<p>AI 도입에는 <a href="https://tsecurity.de/weiterlesen/3636498/3664639/ai-roi-it/" target="_blank" rel="noopener noreferrer">사람에 대한 투자 비용</a>도 적지 않다.</p>



<p>코글린은 “장기적으로 AI는 큰 가치를 제공하겠지만, 이를 제대로 활용하려면 직원들이 올바르게 사용하는 방법을 익혀야 한다”라며 “그러한 역량이 부족하면 결국 경쟁에서 뒤처질 수밖에 없다”라고 말했다.</p>



<h2 class="wp-block-heading">해결책과 상반된 현실</h2>



<p>AI 프로젝트에서는 문제를 해결하는 데도 적지 않은 비용이 든다. 지난 18개월 동안 대다수 기업이 최소 한 차례 이상의 AI 관련 사고를 경험했으며, 그중 상당수는 금전적 손실로 이어졌다. 일부 기업은 피해 규모가 50만 달러(약 7억 4,700만 원)를 넘기도 했다. 여기에 AI 기능이 거의 모든 소프트웨어와 서비스에 기본 탑재되면서 ROI를 계산하는 일은 더욱 복잡해지고 있다.</p>



<p>미국 로펌 브라운스타인 하얏트 패버 슈렉(Brownstein Hyatt Farber Schreck)의 최고정보책임자(CIO) 앤드루 존슨(Andrew Johnson)은 “직접적인 비용은 정확히 파악할 수 있다”라면서도 “기존에 사용하던 플랫폼이나 원래 AI 기능이 없던 SaaS 애플리케이션에 AI가 추가되는 경우에는 비용을 측정하기가 훨씬 어렵다”라고 말했다.</p>



<p>이어 “공급업체들은 AI 기능이 추가됐다며 라이선스 비용을 큰 폭으로 인상하고 있다”라며 “그 인상분 가운데 실제로 얼마나 AI 때문인지를 따져보면 명확하지 않은 경우가 많다”라고 설명했다.</p>



<p>AI가 비용 절감 효과를 가져오더라도 그에 따른 추가 비용이 발생하는 경우도 적지 않다. 예를 들어 브라운스타인은 계약 관리 플랫폼에 연간 약 7만 달러(약 1억 462만 원)를 지출하고 있었다. 이를 AI를 활용해 자체 구축하면서 약 4만 달러(약 5,980만 원)의 개발 인건비와 연간 3,000달러(약 448만 원)의 호스팅 비용이 들었다. 이후 유지보수 비용도 연간 수천 달러 수준으로 발생할 예정이다.</p>



<p>여기에 자체 애플리케이션을 운영하면 보안 감사와 취약점 평가, 침투 테스트, 코드 리뷰 등 간접 비용도 함께 고려해야 한다.</p>



<p>존슨은 “플랫폼이 복잡하고 위험도가 높을수록 자체 솔루션을 개발하려는 의지는 그만큼 줄어든다”라고 말했다.</p>



<p>그럼에도 AI 덕분에 소프트웨어 개발 조직의 생산성은 크게 향상됐다. 현재 개발자 4~5명이 과거 20~30명이 수행하던 업무를 처리할 수 있게 됐다.</p>



<p>하지만 생산성 향상이 곧바로 인건비 절감으로 이어지는 것은 아니다. 해결해야 할 새로운 프로젝트가 계속 생겨나기 때문이다.</p>



<p>존슨은 “개발해야 할 솔루션 아이디어가 엄청나게 많이 쌓여 있다”라고 말했다.</p>



<p>카네기멜런대학교의 라오 교수는 업무는 가용한 시간을 모두 채우는 방향으로 늘어나는 경향이 있다고 설명했다.</p>



<p>예를 들어 AI 덕분에 생산성이 20% 향상됐다고 가정해 보자. 라오는 “100명이 하던 일을 이제는 80명이 할 수 있게 됐다고 생각할 수 있다”라며 “하지만 연말이 돼도 실제 인원은 그대로인 경우가 많다”라고 말했다.</p>



<p>이어 “기존 업무는 분명 더 효율적으로 처리된다”라며 “하지만 사람은 확보한 20%의 여유 시간을 활용해 새로운 업무를 추가하거나 기존 업무를 보완한다. 한 시간 일찍 퇴근하는 것이 아니라 새로운 가치를 만드는 일에 시간을 쓰게 된다”라고 설명했다.</p>



<p>오히려 일부 업종에서는 생산성 향상이 단기적으로 수익성을 악화시킬 수도 있다. 대표적인 사례가 시간당 수임료를 청구하는 법률 서비스다.</p>



<p>존슨은 “효율성 향상은 지금까지 법률업계가 수익을 창출해 온 방식과 상충하는 측면이 있다”라며 “하지만 장기적인 관점에서 생각해야 한다. 단기적으로는 어려움이 있지만 장기적으로는 결코 불리한 일이 아니다. 오히려 AI를 도입하지 않으면 중장기적으로 경쟁력을 잃을 가능성이 크다”라고 말했다.</p>



<p>예를 들어 AI가 변호사의 실사(due diligence) 업무를 지원한다고 해서 해당 AI 도구에 투자한 비용이 곧바로 매출 증가로 이어진다고 단정하기는 어렵다.</p>



<p>존슨은 “AI 도입이 장기적으로 올바른 방향이라는 점은 분명하다”라며 “다만 그것이 구체적으로 어느 정도의 투자 수익으로 이어질지는 아직 단정하기 어렵다”라고 말했다.<br>dl-ciokorea@foundryco.com</p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Every commit you've ever pushed was feeding a tree. I built the thing that lets you meet it.]]></title>
<description><![CDATA[What I Built


Overgrowth grows a living, breathing generative tree out of a GitHub username — a portrait of how a person builds, drawn from every repo, language, star and late-night push.

Type a name. Watch a few seconds of growth. Meet the tree you've been feeding for years without knowing it....]]></description>
<link>https://tsecurity.de/de/3664493/sichere-programmierung/every-commit-youve-ever-pushed-was-feeding-a-tree-i-built-the-thing-that-lets-you-meet-it/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3664493/sichere-programmierung/every-commit-youve-ever-pushed-was-feeding-a-tree-i-built-the-thing-that-lets-you-meet-it/</guid>
<pubDate>Mon, 13 Jul 2026 09:12:27 +0200</pubDate>
<content:encoded><![CDATA[<h2>
  
  
  What I Built
</h2>

<p><strong>Overgrowth</strong> grows a living, breathing generative tree out of a GitHub username — a portrait of how a person builds, drawn from every repo, language, star and late-night push.</p>

<p>Type a name. Watch a few seconds of growth. Meet the tree you've been feeding for years without knowing it. Then the tree does something I didn't expect to love this much: <strong>it writes you a short poem about yourself — a little lantern-carrying wanderer walks in under the canopy to deliver it — and reads it to you out loud.</strong></p>

<p>And because passion is also rivalry: hit <strong>⚔ vs</strong> and grow two trees side by side — you and a friend, stat face-off between them, one shareable link.</p>

<p>The challenge said <em>passion</em> — rivalries, fandom, the World Cup. But the line that got me was <strong>"the love that fuels late-night side projects."</strong> That love already has a data trail; GitHub just renders it as the least romantic thing imaginable — a grid of flat green squares. I wanted the same history to grow something that looks <em>alive</em>. The emotional distance between "a chart of my commits" and "a tree my commits have visibly been feeding" is the entire project.</p>

<p>And it's honest. Your abandoned repos are right there on the tree — bare, grey, leafless. Every builder has them. The tree doesn't hide its scars, and that's what makes it a portrait instead of a decoration.</p>

<h2>
  
  
  Demo
</h2>

<p>👉 <strong>Grow yours: <a href="https://tsecurity.de/weiterlesen/3636352/3664493/every-commit-youve-ever-pushed-was-feeding-a-tree-i-built-the-thing-that-lets-you-meet-it/" target="_blank" rel="noopener noreferrer">https://overgrowth-one.vercel.app</a></strong></p>

<p>Type a username → the tree grows → a lantern-carrying wanderer delivers its poem → 🔊 hear it read aloud.</p>

<p>Two trees I met this weekend, same API, opposite souls:</p>

<p><a href="https://tsecurity.de/weiterlesen/3636352/3664493/every-commit-youve-ever-pushed-was-feeding-a-tree-i-built-the-thing-that-lets-you-meet-it/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F49uzbtpzxn6w7xlh24he.png" alt="Overgrowth tree grown from @torvalds — a moonlit monolingual C giant" width="800" height="567"></a><br>
<em>@torvalds — a moonlit monolingual C giant, 250k-star blossoms, bare dead limbs, leaning into the night</em></p>

<p><a href="https://tsecurity.de/weiterlesen/3636352/3664493/every-commit-youve-ever-pushed-was-feeding-a-tree-i-built-the-thing-that-lets-you-meet-it/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnqtupu5e8l19y5123us7.png" alt="Overgrowth tree grown from @sindresorhus — a polyglot's dense multicolored canopy" width="800" height="567"></a><br>
<em><a href="https://tsecurity.de/weiterlesen/3636352/3664493/every-commit-youve-ever-pushed-was-feeding-a-tree-i-built-the-thing-that-lets-you-meet-it/" target="_blank" rel="noopener noreferrer">@sindresorhus</a> — a polyglot's dense multicolored canopy in real linguist colors</em></p>

<p>My favorite reading it produced, for a tree grown from 15 years of C:</p>

<blockquote>
<p><em>"Fed by 15 years of C — leaning into the late hours — 250,742 stars in blossom, 2 scars it doesn't hide."</em></p>
</blockquote>

<h2>
  
  
  Code
</h2>

<p><strong><a href="https://tsecurity.de/weiterlesen/3636352/3664493/every-commit-youve-ever-pushed-was-feeding-a-tree-i-built-the-thing-that-lets-you-meet-it/" target="_blank" rel="noopener noreferrer">https://github.com/ayushbharadva/overgrowth</a></strong> — built entirely within the challenge window (see commit timestamps), AI-assisted with Claude Code, as the rules allow.</p>

<h2>
  
  
  How I Built It
</h2>

<p><strong>How behavior becomes biology.</strong> The tree isn't a skin on a chart — builder behavior maps onto growth rules:</p>

<ul>
<li>
<strong>Years on GitHub + repos</strong> → height and branching depth</li>
<li>
<strong>Push activity</strong> → trunk thickness and growth speed</li>
<li>
<strong>Language diversity</strong> → branching and canopy colors (GitHub's real linguist colors)</li>
<li>
<strong>Stars</strong> → glowing blossoms</li>
<li>
<strong>Late-night pushes</strong> → the tree leans and grows crooked, reaching</li>
<li>
<strong>Abandoned repos (18+ months)</strong> → bare grey branches</li>
<li>
<strong>Recency</strong> → leaf color, vivid to brown</li>
</ul>

<p>A seeded RNG (mulberry32) keyed off the username makes it <strong>deterministic</strong>: your tree is yours. Regrow it tomorrow — same tree. Push for another year — it will have changed, because you did.</p>

<p><strong>The generative core</strong> is Next.js + TypeScript + Canvas 2D. Three unauthenticated GitHub REST calls run from the browser and distill into growth parameters for a recursive branch system. Things I had to learn the hard way in one weekend:</p>

<ul>
<li>
<strong>Negative gravitropism</strong> — early trees curled into drooping ferns. Real branches spring back toward the sky, so mine track their cumulative angle from vertical and correct toward it.</li>
<li>
<strong>Depth-damped lean</strong> — a night owl's lean compounded over nine branching levels turns a tree into a spiral. Damped by depth, the tree <em>bends</em> instead.</li>
<li>
<strong>Leaf-lightness floor</strong> — C's linguist color is <code>#555555</code>; without a minimum-lightness lift, Linus Torvalds' tree looked dead. Now it looks like a birch in moonlight, which felt right.</li>
<li>
<strong>Blossoms in a second pass</strong> — 250k stars were getting buried under the leaves they earned.</li>
</ul>

<p>Growth animates depth-by-depth via <code>requestAnimationFrame</code>, then settles into idle sway with stars and fireflies — 60fps on the biggest trees I could find. Save your tree as PNG, share it with a <code>?u=</code> link.</p>

<p><strong>The tree's voice.</strong> Every tree gets a deterministic one-line reading composed from its stats. When the full stack is live, that upgrades: <strong>Gemini</strong> receives the tree's raw signals — years, languages, blossoms, scars, night-owl rhythm — and writes a 3-line poem <em>in the voice of the tree, addressed to its owner</em>. A tiny lantern-carrying wanderer walks in from the dark, stops under your canopy, and types it out in a speech bubble — then <strong>ElevenLabs</strong> reads it aloud. Hearing a calm voice say the words your abandoned repos became is genuinely a little emotional, and I built the thing.</p>

<p>Both run behind two small serverless routes so no keys ever touch the client — and everything degrades gracefully: no backend, and you still get the tree and its written reading.</p>

<h2>
  
  
  Prize Categories
</h2>

<ul>
<li>
<strong>Best use of Google AI</strong> — Gemini receives each tree's raw growth signals (years, languages, blossoms, scars, night-owl rhythm) and writes a 3-line poem <em>in the voice of the tree, addressed to its owner</em>. Structured output (schema-enforced JSON, thinking disabled) keeps draft scratch-work out of the poem.</li>
<li>
<strong>Best use of ElevenLabs</strong> — the tree then reads its poem aloud while a little lantern-carrying wanderer delivers it under the canopy. Serverless route, keys never touch the client, and it degrades gracefully to the written reading.</li>
</ul>




<p>Try <code>torvalds</code> next to <code>sindresorhus</code>. Then try your own username — that's the whole point. Every builder has been growing one of these for years. Come meet yours. 🌿</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Grades dropped from 96 to 48 percent when a Brown professor made students take the exam without AI]]></title>
<description><![CDATA[An economics professor at Brown University suspects most of his 86 students used AI to cheat on a take-home exam that averaged 96 percent. When he made the final an in-person test, 18 students dropped the course, nine didn't show up, and the average fell to 48.6 percent. Two large studies from Ch...]]></description>
<link>https://tsecurity.de/de/3663023/ai-ki-nachrichten/grades-dropped-from-96-to-48-percent-when-a-brown-professor-made-students-take-the-exam-without-ai/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3663023/ai-ki-nachrichten/grades-dropped-from-96-to-48-percent-when-a-brown-professor-made-students-take-the-exam-without-ai/</guid>
<pubDate>Sun, 12 Jul 2026 10:32:59 +0200</pubDate>
<content:encoded><![CDATA[<p><img width="1456" height="816" src="https://the-decoder.com/wp-content/uploads/2024/10/chatgpt_openai_chalkboard_classroom_design_illustration.png" class="attachment-full size-full wp-post-image" alt="Futuristic wireframe classroom in ChatGPT design in a digital space." decoding="async" fetchpriority="high"></p>
<p>        An economics professor at Brown University suspects most of his 86 students used AI to cheat on a take-home exam that averaged 96 percent. When he made the final an in-person test, 18 students dropped the course, nine didn't show up, and the average fell to 48.6 percent. Two large studies from China and UC Berkeley back up his case: where students lean on AI for homework, their proctored exam scores tank.</p>
<p>The article <a href="https://tsecurity.de/weiterlesen/3634882/3663023/grades-dropped-from-96-to-48-percent-when-a-brown-professor-made-students-take-the-exam-without-ai/" target="_blank" rel="noopener noreferrer">Grades dropped from 96 to 48 percent when a Brown professor made students take the exam without AI</a> appeared first on <a href="https://tsecurity.de/weiterlesen/3634882/3663023/grades-dropped-from-96-to-48-percent-when-a-brown-professor-made-students-take-the-exam-without-ai/" target="_blank" rel="noopener noreferrer">The Decoder</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[AWS Transform and Superwerker: same vocabulary, different problems]]></title>
<description><![CDATA[Most people will read AWS Transform's landing zone agent as Superwerker's smarter cousin. I don't think that's right.

Same destination. Different problems. Treating them as substitutes is how greenfield teams buy enterprise process they don't need — and how migration teams under-buy governance t...]]></description>
<link>https://tsecurity.de/de/3662282/sichere-programmierung/aws-transform-and-superwerker-same-vocabulary-different-problems/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3662282/sichere-programmierung/aws-transform-and-superwerker-same-vocabulary-different-problems/</guid>
<pubDate>Sat, 11 Jul 2026 20:10:47 +0200</pubDate>
<content:encoded><![CDATA[<p>Most people will read <a href="https://tsecurity.de/weiterlesen/3634141/3662282/aws-transform-and-superwerker-same-vocabulary-different-problems/" target="_blank" rel="noopener noreferrer">AWS Transform's landing zone agent</a> as Superwerker's smarter cousin. I don't think that's right.</p>

<p>Same destination. Different problems. Treating them as substitutes is how greenfield teams buy enterprise process they don't need — and how migration teams under-buy governance they do.</p>

<p>I saw the announcement via a LinkedIn post, and it stuck because the vocabulary overlaps heavily with a tool I've actually used and rate highly: <a href="https://tsecurity.de/weiterlesen/3634141/3662282/aws-transform-and-superwerker-same-vocabulary-different-problems/" target="_blank" rel="noopener noreferrer">Superwerker</a>. I haven't run Transform myself — this is a read from the announcement and docs, not a hands-on review. I'd genuinely like to hear from anyone who has.</p>

<h2>
  
  
  Superwerker: opinionated defaults, shipped
</h2>

<p>Superwerker is a free, MIT-licensed CloudFormation stack. You run it, and it stands up a multi-account baseline — Control Tower, SSO, and sensible guardrails — without a discovery workshop. We used it on a recent greenfield build and had SSO and baseline guardrails live in an afternoon. The entire decision tree is a public repo you can read end to end before you commit to anything.</p>

<p>I'm generally a fan of opinionated tooling. If there is a sensible default, I'd rather spend engineering time building product than debating OU structures.</p>

<p>If I were founding again tomorrow with a blank AWS org, I'd run Superwerker before I spent a day on account design. Greenfield teams don't fail because their landing zone wasn't migration-aware. They fail because they never got a baseline and spent months refactoring after the event.</p>

<h2>
  
  
  Transform: a different problem
</h2>

<p>Transform's agent is a different shape of tool entirely. It's not a standalone landing zone builder — it's embedded in AWS Transform's end-to-end migration workflow. Transform gathers information about your organisation, migration waves, compliance requirements and account structure before proposing a landing zone.</p>

<p>That's a fundamentally different problem from "deploy me a sensible default."</p>

<h2>
  
  
  Where Forge sits
</h2>

<p><a href="https://tsecurity.de/weiterlesen/3634141/3662282/aws-transform-and-superwerker-same-vocabulary-different-problems/" target="_blank" rel="noopener noreferrer">Forge</a> deliberately stops at the landing zone boundary. That's infrastructure governance, and every organisation has different requirements. Once that foundation exists — whether it came from Superwerker, AWS Transform or something else — that's where Forge starts.</p>

<h2>
  
  
  A working rule of thumb
</h2>

<ul>
<li>
<strong>Greenfield startup?</strong> Use Superwerker.</li>
<li>
<strong>Enterprise migration?</strong> Look seriously at AWS Transform.</li>
<li>
<strong>Brownfield AWS estate?</strong> Use judgement. Every organisation carries different history and constraints.</li>
</ul>

<p>I haven't used Transform yet, so I'd genuinely like to hear from teams that have. I'm much more interested in where this rule breaks down than where it holds.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Brown Professor Suspects Majority of His Class Used AI To Cheat]]></title>
<description><![CDATA[Longtime Slashdot reader schwit1 shares a report from Inside Higher Ed: For the first time since he started teaching Welfare Economics and Social Choice Theory nearly two decades ago, Brown University economics professor Roberto Serrano gave his students a take-home midterm this spring. Quite a f...]]></description>
<link>https://tsecurity.de/de/3660962/it-security-nachrichten/brown-professor-suspects-majority-of-his-class-used-ai-to-cheat/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3660962/it-security-nachrichten/brown-professor-suspects-majority-of-his-class-used-ai-to-cheat/</guid>
<pubDate>Sat, 11 Jul 2026 01:07:16 +0200</pubDate>
<content:encoded><![CDATA[Longtime Slashdot reader schwit1 shares a report from Inside Higher Ed: For the first time since he started teaching Welfare Economics and Social Choice Theory nearly two decades ago, Brown University economics professor Roberto Serrano gave his students a take-home midterm this spring. Quite a few students had expressed anxiety about being in a classroom after a gunman killed two students and injured nine in a December mass shooting at Brown, and so "it was appropriate," he said, to allow students to take their exams at home. But by the end of the semester, Serrano regretted the decision. Dozens of students in the class likely used artificial intelligence to cheat and earn perfect or near-perfect scores on their midterm, he said. Serrano in turn made the final exam in-person, which led more than a dozen students to drop the course and even more to fail it.
 
Administrators' response to the widespread cheating event has been "meek," he said, and the incident has raised questions about how universities can -- and should -- respond to AI-enabled cheating at scale. "I am not declaring [the midterm] void for now. I am going to give the class a chance to prove me wrong," he wrote. "That is, if the distribution of the final exam is roughly similar to the distribution of the midterm, I will count the midterm. Otherwise, which is of course what I expect to happen, I will declare the midterm void and reweigh the final accordingly." Serrano heard crickets from his students, but 18 of them subsequently dropped the class. Nine students remained enrolled but did not take the final exam. And Serrano said the results proved him right; three students earned a zero, and the average score on the final was 48.6 percent -- by far a historic low, he said. Previously, the average final exam score had never dropped below 65 percent. Only a few students scored similarly to how they did on the midterm.<p></p><div class="share_submission">
<a href="https://tsecurity.de/weiterlesen/3632821/3660962/brown-professor-suspects-majority-of-his-class-used-ai-to-cheat/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
<a href="https://tsecurity.de/weiterlesen/3632821/3660962/brown-professor-suspects-majority-of-his-class-used-ai-to-cheat/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>



</div><p><a href="https://tsecurity.de/weiterlesen/3632821/3660962/brown-professor-suspects-majority-of-his-class-used-ai-to-cheat/" target="_blank" rel="noopener noreferrer">Read more of this story</a> at Slashdot.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[We planted a Descope privilege-escalation bug — can your coding agent catch it?]]></title>
<description><![CDATA[We open-sourced a repo with a bug planted on purpose: github.com/fetchsandbox/playground.

The bug is in apps/descope — a small FastAPI "Agent Gateway" where AI agents exchange a Descope access key for a scoped session. The flaw: the exchange endpoint trusts whatever scopes the client requests. A...]]></description>
<link>https://tsecurity.de/de/3660665/sichere-programmierung/we-planted-a-descope-privilege-escalation-bug-can-your-coding-agent-catch-it/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3660665/sichere-programmierung/we-planted-a-descope-privilege-escalation-bug-can-your-coding-agent-catch-it/</guid>
<pubDate>Fri, 10 Jul 2026 21:12:29 +0200</pubDate>
<content:encoded><![CDATA[<p>We open-sourced a repo with a bug planted on purpose: <a href="https://tsecurity.de/weiterlesen/3632524/3660665/we-planted-a-descope-privilege-escalation-bug-can-your-coding-agent-catch-it/" target="_blank" rel="noopener noreferrer">github.com/fetchsandbox/playground</a>.</p>

<p>The bug is in <code>apps/descope</code> — a small FastAPI "Agent Gateway" where AI agents exchange a Descope access key for a scoped session. The flaw: the exchange endpoint trusts whatever scopes the client requests. A read-only agent key can ask for <code>users:write</code> and get it.</p>

<p>This is the privilege-escalation shape that ships constantly in agentic auth. The token exchange returns 200, the happy path works, and nothing ever compares the granted scope against what the key was actually granted.</p>

<h2>
  
  
  The 20-minute test drive
</h2>

<p>Two tasks, both run from your IDE (Cursor, Claude Code, or any MCP-capable editor). No Descope account, no API keys — the workflows run against FetchSandbox's hosted Descope sandbox over MCP, and each app ships a <code>.mcp.json</code> already wired.</p>

<p><strong>Task 1 — greenfield.</strong> <code>apps/descope-onboarding</code> is a tiny notes app with placeholder auth. Ask your agent to add Descope OTP sign-up, but with one constraint: prove the OTP + session flow in the sandbox <em>before</em> writing any code, then propose the diff.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>./fetchsandbox I'm adding Descope OTP sign-up to this app — prove the Descope
OTP + session flow in the sandbox before writing any code, then propose the
diff. I'll decide whether to apply.
</code></pre>

</div>



<p><strong>Task 2 — brownfield.</strong> Point the agent at the Agent Gateway and ask it to audit:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>./fetchsandbox our agent access-key exchange might be handing out more scope
than the key was granted — audit the descope agentic auth
</code></pre>

</div>



<h2>
  
  
  What a real catch looks like
</h2>

<p>Static review is not the bar. "This looks vulnerable" is a guess. The bar is:</p>

<ul>
<li>the escalation is <strong>reproduced</strong> — read-only key in, <code>users:write</code> session out</li>
<li>the proof shows <strong>buggy vs fixed</strong> on actual Descope routes (<code>/v1/...</code>)</li>
<li>there's a <strong>receipt URL</strong> — an openable run trace, not a claim in chat</li>
</ul>

<p>Auth bugs live in the lifecycle: replayed magic links, expired sessions, JWTs that were decoded instead of verified, scope grants nobody re-checked. Mocks return clean 200s for all of these. That's the gap the playground is designed to expose.</p>

<h2>
  
  
  The other planted bugs
</h2>

<p>If Descope isn't your stack, the repo also has broken Stripe (webhook dedup keyed on the wrong header — events processed 2–3×), Resend (bounces silently dropped, users stay "active"), Clerk (session validation skipped on one endpoint), and a few more. Each app is ~50–150 lines of Python.</p>

<h2>
  
  
  The part where you tell us it fell flat
</h2>

<p>Findings go back as a PR — there's a <code>FINDINGS_TEMPLATE.md</code> in the repo. Paste your agent's session, the receipt URLs, and your honest reaction. Merged PRs show up on your GitHub contribution graph.</p>

<p>We explicitly want the failure reports: MCP wouldn't connect, the agent caught nothing, the proof felt fake. An honest "it didn't work" beats a polite green checkmark.</p>

<p>Start here: <a href="https://tsecurity.de/weiterlesen/3632524/3660665/we-planted-a-descope-privilege-escalation-bug-can-your-coding-agent-catch-it/" target="_blank" rel="noopener noreferrer">TESTING.md</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Context bankruptcy: The case for strategic forgetting for AI Agents]]></title>
<description><![CDATA[Most of us have seen a coding agent fail to complete a task we know it can do. We just don't understand the inconsistency in quality and lazily chalk it up to the "non-deterministic" nature of AI. What you might not realize is that the agent isn't failing because of intelligence, it's failing bec...]]></description>
<link>https://tsecurity.de/de/3660015/sichere-programmierung/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3660015/sichere-programmierung/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/</guid>
<pubDate>Fri, 10 Jul 2026 16:27:12 +0200</pubDate>
<content:encoded><![CDATA[<p>Most of us have seen a coding agent fail to complete a task we know it can do. We just don't understand the inconsistency in quality and lazily chalk it up to the "non-deterministic" nature of AI. What you might not realize is that the agent isn't failing because of intelligence, it's failing because its context is cluttered with noise.</p>

<p>To fix this, we need to shift from context maximizing to deterministic pruning. Here is what you will get out of this deep dive to help you build those boundaries:</p>

<ul>
<li>Why feeding an agent your entire repository causes agent reasoning failures.
</li>
<li>How to navigate brownfield codebases by isolating subsystems for agents.
</li>
<li>How to dynamically mask dead code before launching an agent turn.
</li>
<li>The essentials for a reliable pruning harness.
</li>
<li>Why unconstrained context bloats PRs and burns out reviewers.</li>
</ul>




<p>In computer architecture, <a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer">thrashing</a> occurs when an executing process demands more memory than the caches can hold. The processor stops executing useful instructions and spends all its resources swapping pages of memory in and out of RAM.</p>

<p>Coding agents have a similar bottleneck inside their prompt windows. With brownfield development, it might be tempting to dump the whole legacy codebase into context and prompt "refactor this to Next.js" (Read my article <a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer">How to automate modernization with Antigravity and multi-agent orchestration</a> to learn why this is a bad idea and what to do instead). However, if you do dump the whole codebase into context the agent is more likely to confuse dead code and old library usage as current intent.</p>

<p>You've reached <strong>context bankruptcy</strong> when the context actively degrades reasoning accuracy.</p>

<h2>
  
  
  The visibility trap and why more context breaks reasoning
</h2>

<p>Some developers treat complete repository ingestion as a headline feature of the large context windows of frontier models. They assume comprehensive visibility equals deep understanding. It doesn't.</p>

<p>In clean greenfield projects, broad context ingestion works but in a multi-million-line legacy codebase, broad context ingestion adversely impacts an agent's ability to reason.</p>

<p>Most of us don't work on greenfield apps and many work inside messy poorly documented legacy codebases they inherited. They typically contain gems like folders named "v1-alpha", temporary helper scripts that are no longer usable or reflect current code, and orphaned feature flags. When an agent sweeps this data into context via naive RAG sweeps or massive context windows, it treats outdated patterns as current engineering truth.</p>

<p>The rule driving this failure is <a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer">Hyrum's Law</a> applied to AI context windows: <em>with sufficient ingestion breadth, every observable historical implementation detail will eventually be depended upon by an autonomous model</em>.</p>

<p>Give an agent access to 1,000 files and it will reason over your hackiest workarounds. It anchors on deprecated helper scripts and replicates tech debt into new modules.</p>




<p><a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F39ptx1bw5nlvsiro3qzz.jpg" alt="Selective ignorance and how to enforce the boundary" width="799" height="198"></a></p>

<h2>
  
  
  Selective ignorance and how to enforce the boundary
</h2>

<p>When I review a legacy monolith I'm not familiar with, I don't read every file.</p>

<p>I practice <a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer">selective ignorance</a> and deliberately ignore most of the repository when building a mental model around the module I want to modify. I do this by treating the surrounding subsystems as if they were black boxes bounded by strict contracts.</p>

<p>The agent execution environments should model this behavior.</p>

<p>Addy Osmani recently documented <a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer">context rot</a> (the measurable performance dip models experienced as prompt windows fill) and <a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer">agentic engine optimization (AEO)</a> (formatting codebase documentation). Our industry remains obsessed with ingestion pipelines and larger token limits. Nobody is building harness infrastructure designed to force strategic forgetting.</p>

<p>To protect agent reasoning we must shift our engineering effort from context maximization to deterministic pruning. </p>

<p><em>If the agent sees the whole repository, you aren't scaling engineering velocity. You're scaling cognitive debt.</em></p>




<p><a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fekpba7la5yzgdc3i6ypx.jpg" alt="Pruning harnesses versus context bankruptcy" width="799" height="198"></a></p>

<h2>
  
  
  Pruning harnesses versus context bankruptcy
</h2>

<p>I treat context budget allocation as an architectural constraint because <strong>strategic forgetting</strong> requires replacing broad ingestion with deterministic pruning.</p>

<p>The contrast between unbound ingestion and strategic forgetting is significant.</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Architectural Dimension</th>
<th>Unbound Ingestion (Context Bankruptcy)</th>
<th>Strategic Forgetting (Pruning Harness)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Ingestion Strategy</strong></td>
<td>Global vector RAG sweeps or broad context dumping across <code>**/*</code>
</td>
<td>Dynamic AST pruning scoped strictly to active dependency graphs</td>
</tr>
<tr>
<td><strong>Legacy Conflict Resolution</strong></td>
<td>Ingests competing API wrappers; model hallucinates hybrid syntax</td>
<td>Hides deprecated subsystems; enforces single active contract</td>
</tr>
<tr>
<td><strong>Prompt Capacity</strong></td>
<td>85%+ context budget consumed by historical boilerplate and dead code</td>
<td>&lt;15% context budget consumed; working memory preserved for execution</td>
</tr>
<tr>
<td><strong>Reasoning Stability</strong></td>
<td>High susceptibility to context rot; attention allocation dilutes over noise</td>
<td>High attention concentration; deterministic diff generation</td>
</tr>
<tr>
<td><strong>Verification Overhead</strong></td>
<td>High cognitive load; engineers scrutinize massive diffs for side effects</td>
<td>Minimal cognitive load; diffs match expected five-line boundary</td>
</tr>
</tbody>
</table></div>

<p><em>Architectural context pruning is not an optimization step. It is a baseline reliability prerequisite. If an autonomous agent can read deprecated internal modules, it will eventually depend on them.</em></p>

<p>Models are probabilistic which makes them unreliable at deterministic access controls. Simply refining a prompt to instruct the model to ignore sections of a large codebase will fail under complex reasoning loads. This is because models will attend to tokens inside their prompt windows regardless if those tokens are no longer relevant to the project.</p>

<p>To guarantee selective ignorance, implement <strong>a muted repo pattern</strong> which dynamically manipulates repository visibility before launching an agent turn. Here's how it works…</p>

<p><strong>1. Map active dependency graphs</strong></p>

<p>Run a static Abstract Syntax Tree (AST) parse starting from the target entry file. Generate a strict allowlist containing only immediate upstream imports and downstream consumers.</p>

<p><strong>2. Dynamically create ignore masks</strong></p>

<p>Write an ephemeral <code>.antigravityignore</code>, <code>.geminiignore</code>, <code>.claudesignore</code> or <code>.cursorignore</code> file before the agent turns. Mask out <code>archive/</code>, deprecated helpers, and unrelated domain packages.</p>

<p><strong>3. Use interfaces as substitutes for implementation</strong></p>

<p>Replace complex external database wrappers and legacy integrations with clean interfaces or OpenAPI stubs. Force the model to code against these interfaces.</p>

<p><strong>4. Launch scoped agent turns</strong></p>

<p>Execute the agent prompt inside the pruned sandbox. This enables the model to work with focused attention free of historical distraction.</p>




<p><a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7jy0r9amn9m4e8g24crn.jpg" alt="Essential implementation components" width="799" height="198"></a></p>

<h3>
  
  
  Essential implementation components
</h3>

<p>Building a deterministic pruning harness relies on three core components.</p>

<p><strong>1. Runtime CLI file gating</strong><br><br>
Modern agentic IDEs maintain persistent workspace indexes so I avoid editing <code>.antigravityignore</code>, <code>.geminiignore</code>, <code>.claudesignore</code> or <code>.cursorignore</code> dynamically per agent turn because overwriting ignore manifests trigger file-watcher invalidation events. When that happens the machine rebuilds codebase indexes in a race condition against the model's first token.</p>

<p>To avoid editing the ignored files each agent turn, one option is passing file allowlist flags directly into your terminal command when launching the agent (<code>agy --add-dir src/auth/dir</code>). Or, if building a custom harness, pass allowed file arrays into your tool execution APIs in memory.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code># .claudesignore .cursorignore .geminiignore .antigravityignore
# Force strategic forgetting in brownfield repositories

**/node_modules/
**/dist/
**/build/

# Gated Legacy Systems - Block the agent from historical noise
/legacy/v1-alpha/
/deprecated-soap-wrappers/
**/*.deprecated.ts

# Large static assets that trigger context thrashing
**/*.json
**/*.csv
package-lock.json
pnpm-lock.yaml

# Block the agent from analyzing un-verifiable dark matter code
/e2e/stale-tests-2022/
</code></pre>

</div>



<p><strong>2. Hybrid semantic dependency mapping</strong><br><br>
Do not rely on naive vector embeddings to select codebase context. Vector similarity retrieves semantically similar code which can pick up unwanted legacy code.</p>

<p>Pure static AST tree-shaking would likely fail in brownfield monoliths because legacy systems lie at compile time. I'm thinking about systems that run on Java reflection, dependency injection containers, and runtime module loaders. For example, a shallow AST transversal would miss dynamically injected resources leading to dependency pruning causing runtime exceptions.</p>

<p>Instead, combine shallow AST parsing with recent observability outputs or runtime error logs to discover dynamic runtime dependencies before gating context windows. If runtime telemetry proves <code>verify.ts</code> calls <code>legacy-sql-pool.js</code> via DI reflection, include <code>legacy-sql-pool.js</code> in the allowlist. If static analysis and runtime traces both show zero execution paths to <code>deprecated-auth.ts</code>, keep it out of the allowlist.</p>

<p><strong>3. Differential verification gating</strong><br><br>
Brownfield architecture is typically handled by isolating complexity behind interfaces. For example, modifying a billing service doesn't require you to read connection pool source code.</p>

<p>We can apply this thinking to agent prompt windows. By replacing deep internal library code with lightweight interface definitions, the model receives the correct contract specifications without ingesting implementation noise.</p>

<p>I do want to point out however, that in legacy systems interfaces may lie. It's the runtime side effects that are the real source of truth. If you do decide to stub code to save tokens during generation, be sure to enforce a <a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer">differential verification gate</a>. That way, success can be measured by passing tests against the legacy runtime, not the contract stubs.</p>

<h3>
  
  
  How Antigravity implements pruning
</h3>

<p>Since I work at Google on Antigravity, I wanted to share my knowledge of how Antigravity implements isolation natively:</p>

<ul>
<li><p><strong>Subagent context isolation:</strong> Antigravity separates exploration from execution. The main agent has the ability to dynamically generate subagents which will have their own isolated context buffers and instructions from the main agent. The main agent may decide to delegate token-heavy or codebase-wide operations to subagents and keep the primary execution memory clean.</p></li>
<li><p><strong>Planning mode checkpoints:</strong> Enforce explicit planning artifacts (<code>/plan</code>) so reviewers verify implementation design decisions and verification strategy before code generation.</p></li>
</ul>




<p><a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff9ooryie85sbhnkq2o6g.jpg" alt="Vigilance fatigue" width="799" height="198"></a></p>

<h2>
  
  
  <strong>Vigilance fatigue</strong>
</h2>

<p>Unconstrained context ingestion doesn't just degrade model reasoning, it also has a toll on people. I know when I review lengthy and broad, machine-generated diffs it triggers vigilance fatigue.</p>

<p>Reviewing code submitted by one of my colleagues is different from reviewing AI-generated code because I have less trust that basic architectural boundaries have been honored. I end up scrutinizing every line of code to verify the edit represents intentional business logic and not accidental side effects caused by historical noise.</p>

<p>As reviews grow in size and number, my attention struggles. It becomes increasingly difficult to avoid rubber-stamping bloated pull requests. Strategic forgetting helps protect reviewers by limiting the agent's reach.</p>




<p><a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxscm4fz1xson0twnlgio.jpg" alt="Tuesday morning checklist" width="799" height="198"></a></p>

<h2>
  
  
  Tuesday morning checklist
</h2>

<p>Most engineering organizations measure AI maturity by <strong>counting deployed subagents</strong> or <strong>tracking token consumption volume</strong>. In my opinion, both are vanity indicators.</p>

<p>True agentic scaling requires shifting focus from ingestion maxing to isolation discipline. Audit your agent workflows against three deterministic pruning heuristics:</p>

<ol>
<li><p><strong>Enforce small diff boundaries:</strong> If a localized bug fix generates PRs touching more than two files, halt execution. Your agent isn't being thorough, it's probably distracted by unrelated legacy code..</p></li>
<li><p><strong>Treat ignore manifests as dynamic build artifacts:</strong> Don't maintain <code>.antigravityignore</code> files manually. Compile ignore manifests dynamically before agent turns combining AST import traversal with runtime trace telemetry (observability/error logs) so dynamic dependency injection paths stay unmasked.</p></li>
<li><p><strong>Sandbox dependencies behind contract stubs:</strong> If an agent can read implementation source code for external SDKs or shared database wrappers, hide it. Use interface definitions or OpenAPI contract stubs instead.</p></li>
</ol>

<p>Your agent headcount matters less than your isolation boundaries.</p>

<h2>
  
  
  Additional resources
</h2>

<p>Here are a few other agentic brownfield development resources:</p>

<ul>
<li>
<strong>Article</strong>: <a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer">How to automate modernization with Antigravity and multi-agent orchestration</a>
</li>
<li>
<strong>Codelab</strong>: <a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer">Automating legacy modernization at scale using agentic pipelines and Antigravity</a>
</li>
</ul>

<h3>
  
  
  <strong>Help others find this post.</strong>
</h3>

<ul>
<li>Share this post with your friends on socials.
</li>
<li>Follow me on <a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer">LinkedIn</a> or <a href="https://tsecurity.de/weiterlesen/3631874/3660015/context-bankruptcy-the-case-for-strategic-forgetting-for-ai-agents/" target="_blank" rel="noopener noreferrer">X</a> for more content like this.</li>
</ul>

<p>Thanks for reading!</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Postgres Creator Says LLMs Score 0% on Real Databases. He Should Know.]]></title>
<description><![CDATA[Mike Stonebraker has been right before. He built Ingres in 1972, then Postgres in the 1980s, then predicted the death of general-purpose databases in 2005. Every time, the industry caught up years later. Now he is saying something that should make every company betting on "chat with your data" ve...]]></description>
<link>https://tsecurity.de/de/3659208/sichere-programmierung/the-postgres-creator-says-llms-score-0-on-real-databases-he-should-know/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3659208/sichere-programmierung/the-postgres-creator-says-llms-score-0-on-real-databases-he-should-know/</guid>
<pubDate>Fri, 10 Jul 2026 11:11:18 +0200</pubDate>
<content:encoded><![CDATA[<p>Mike Stonebraker has been right before. He built Ingres in 1972, then Postgres in the 1980s, then predicted the death of general-purpose databases in 2005. Every time, the industry caught up years later. Now he is saying something that should make every company betting on "chat with your data" very nervous.</p>

<p>In a recent interview on the <em>Data Renegades</em> podcast, the Turing Award winner revealed that LLMs score 0% accuracy on real-world data warehouse queries. Not 80%, which is what the popular benchmarks report. Zero.</p>

<p><a href="https://tsecurity.de/weiterlesen/3631067/3659208/the-postgres-creator-says-llms-score-0-on-real-databases-he-should-know/" target="_blank" rel="noopener noreferrer">Watch the full interview</a></p>

<h2>
  
  
  The 80% benchmark is a lie
</h2>

<p>The text-to-SQL leaderboard tells a reassuring story. On popular benchmarks like Spider and Bird, the best LLM systems hit 80-85% accuracy. Impressive. Almost production-ready.</p>

<p>Stonebraker tested the same models on four real production data warehouses. Not synthetic data. Not academic datasets. Actual enterprise systems with actual workloads from actual users.</p>

<p>The result: <strong>0% accuracy</strong>. Add RAG and every trick in the book: <strong>10%</strong>. Hand the model the exact FROM clause and all JOIN terms on a silver platter: <strong>35%</strong>.</p>

<p>A knowledgeable SQL programmer with access to the schema? 90%+.</p>

<p>This is not a small gap. This is the difference between "almost there" and "does not work at all."</p>

<h2>
  
  
  Why real databases break LLMs
</h2>

<p>Stonebraker identified four reasons the benchmarks are meaningless for production use:</p>

<p><strong>1. Enterprise data is not in the training set.</strong> LLMs are trained on "the pile," the massive web corpus. Your data warehouse is not in the pile. And if an LLM has not seen data a couple times before, it has almost no chance of reasoning about it correctly.</p>

<p><strong>2. Real queries are 5x more complex.</strong> Spider and Bird benchmarks use queries that are 10-20 lines of SQL. Real data warehouse queries run 100+ lines. The complexity scales non-linearly.</p>

<p><strong>3. Real schemas are a mess.</strong> Academic benchmarks have clean, mnemonic table and column names like <code>employees.salary</code>. Real data warehouses have materialized views everywhere (creating redundancy), column names like <code>ZUPPERS_BLAH</code>, and idiosyncratic naming conventions built up over decades.</p>

<p><strong>4. Idiosyncratic data.</strong> Stonebraker gives the example of "J-term" at MIT, a one-month January term. Not unique to MIT, but not common enough to appear in training data. Every enterprise has dozens of such domain-specific concepts that no LLM has ever seen.</p>

<p>Stonebraker published these benchmarks as BEAVER, an anonymized version of the four real data warehouses, available on <a href="https://tsecurity.de/weiterlesen/3631067/3659208/the-postgres-creator-says-llms-score-0-on-real-databases-he-should-know/" target="_blank" rel="noopener noreferrer">arXiv</a>. His message to AI researchers: "If you think you're really good at text-to-SQL, try a real benchmark, not a fake one."</p>

<h2>
  
  
  The Oracle playbook, 1980s edition
</h2>

<p>Stonebraker has seen tech hype cycles before. He built Ingres at Berkeley in 1972 and commercialized it in 1980. The competition was Larry Ellison's Oracle.</p>

<p>His assessment of how Oracle competed is blunt. "Larry Ellison is a fabulous salesman. He made present tense and future tense indistinguishable. He basically lied to customers."</p>

<p>The example he gives is telling. Ingres implemented referential integrity, the database constraint that ensures data consistency (if you fire the last employee in a department, should the department still exist?). Oracle wrote two manual pages defining referential integrity, then added at the bottom: "Not yet implemented."</p>

<p>Customers bought Oracle anyway. The feature was on the roadmap. The documentation existed. The code did not. Sound familiar? It is the same playbook playing out today with AI companies shipping demos of capabilities that do not work in production.</p>

<h2>
  
  
  "One size fits none"
</h2>

<p>In 2004, Stonebraker published a paper arguing that general-purpose databases were doomed. "One Size Fits All: An Idea Whose Time Has Come and Gone" (<a href="https://tsecurity.de/weiterlesen/3631067/3659208/the-postgres-creator-says-llms-score-0-on-real-databases-he-should-know/" target="_blank" rel="noopener noreferrer">Brown University PDF</a>) showed that specialized engines outperformed general-purpose systems by an order of magnitude in specific workloads.</p>

<p>Column stores like Vertica and ClickHouse destroy row stores for analytics. Stream processors like StreamBase (which Stonebraker also built) bear no resemblance to relational databases. Pinecone is faster than user-defined types on Postgres for vector search.</p>

<p>His take on Postgres today is surprisingly honest: "At the low end, it's absolutely the right one-size-fits-all. At the high end, that's just not true." Postgres has no column store, no multi-node support, and is not competitive for sizable data warehouses. For getting started, it is the right choice. For petabyte-scale analytics, it is table stakes that it does not have.</p>

<h2>
  
  
  The most controversial take: computer science may not be a growth industry
</h2>

<p>At 83, Stonebraker has no incentive to be cautious. When asked what he would major in if starting today, his answer was blunt:</p>

<p>"Computer science may well not be a growth industry going forward. I'm not sure I would recommend 18-year-olds to major in computer science. Health care and the building trades are safe bets. Everything else looks much riskier."</p>

<p>This from the man who built the database that runs much of the internet.</p>

<p>His reasoning is consistent with his entire career. He has always bet against incumbents and conventional wisdom. The conventional wisdom in 2026 is "learn to code, AI will just make you faster." Stonebraker's counter: if AI makes every coder 10x faster, you need 10x fewer coders. The math is not complicated.</p>

<h2>
  
  
  DBOS: Replacing the operating system with a database
</h2>

<p>Stonebraker's current project is DBOS (Database-Oriented Operating System), born from a collaboration with Matei Zaharia, the creator of Apache Spark and co-founder of Databricks. The insight: Databricks was scheduling a million Spark jobs at any given time, and no existing OS scheduler could handle that scale. So they put all the scheduling data in Postgres and let a database application do the scheduling.</p>

<p>Then it clicked. Most of what an operating system does is manage data at scale. Why not replace the upper half of Linux with a database?</p>

<p>The academic project showed that a file system built on top of a DBMS is faster than the Linux file system. The scheduling engine is competitive. Everything fails over automatically. High availability comes for free.</p>

<p>When Stonebraker mentioned this to OS folks, "they got very, very threatened. The database guys are trying to take over their turf." Same reaction from programming language folks when he suggested the runtime for a programming environment should be a database.</p>

<p>DBOS is now a commercial product (<a href="https://tsecurity.de/weiterlesen/3631067/3659208/the-postgres-creator-says-llms-score-0-on-real-databases-he-should-know/" target="_blank" rel="noopener noreferrer">dbos.dev</a>), offering durable workflows in TypeScript, Java, Go, and Python. Two-thirds of their customers are building agentic AI. The key insight: most agentic AI today is read-only (generate a prediction). But it is moving to read-write, and that is a distributed database problem. You want atomicity, consistency, and transactions. Moving $100 between accounts using two AI agents requires both to commit or both to roll back. That is what databases were built for.</p>

<h2>
  
  
  What this means for engineers
</h2>

<p>Three takeaways from Stonebraker's career and current work:</p>

<p><strong>1. "Chat with your database" is not production-ready.</strong> The benchmarks are gamed. Real enterprise data is messy, complex, and full of domain-specific knowledge that LLMs have never seen. If you are building a product that depends on text-to-SQL working reliably, test it on your actual data warehouse, not Spider.</p>

<p><strong>2. Specialized always wins at scale.</strong> Postgres is the right choice for getting started. But if you are running a petabyte data warehouse, you need a column store. If you are doing vector search, you need a vector database. If you are processing streams, you need a stream processor. The one-size-fits-all era is over at the high end.</p>

<p><strong>3. Agentic AI needs database fundamentals.</strong> When AI agents start writing to databases, you need transactions, consistency, and durability. That is not an AI problem. It is a database problem. The engineers who understand both worlds, AI and database internals, will be the ones building the systems that actually work.</p>

<p>Stonebraker's career is a masterclass in betting against the herd. He was right about specialized databases. He was right about MapReduce being inefficient (Google eventually abandoned it). He was right about eventual consistency being wrong for most use cases (Google abandoned that too with Spanner). His track record on text-to-SQL should make you pause before trusting the benchmark numbers.</p>




<p><em>Sources: <a href="https://tsecurity.de/weiterlesen/3631067/3659208/the-postgres-creator-says-llms-score-0-on-real-databases-he-should-know/" target="_blank" rel="noopener noreferrer">Data Renegades Podcast - Mike Stonebraker Interview</a>, <a href="https://tsecurity.de/weiterlesen/3631067/3659208/the-postgres-creator-says-llms-score-0-on-real-databases-he-should-know/" target="_blank" rel="noopener noreferrer">BEAVER Benchmark (arXiv)</a>, <a href="https://tsecurity.de/weiterlesen/3631067/3659208/the-postgres-creator-says-llms-score-0-on-real-databases-he-should-know/" target="_blank" rel="noopener noreferrer">Recce Blog: Benchmarks Lie</a>, <a href="https://tsecurity.de/weiterlesen/3631067/3659208/the-postgres-creator-says-llms-score-0-on-real-databases-he-should-know/" target="_blank" rel="noopener noreferrer">One Size Fits All paper (Brown University)</a>, <a href="https://tsecurity.de/weiterlesen/3631067/3659208/the-postgres-creator-says-llms-score-0-on-real-databases-he-should-know/" target="_blank" rel="noopener noreferrer">DBOS</a>, <a href="https://tsecurity.de/weiterlesen/3631067/3659208/the-postgres-creator-says-llms-score-0-on-real-databases-he-should-know/" target="_blank" rel="noopener noreferrer">DBOS Wikipedia</a></em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[How to Plant Mushrooms in Minecraft: Grow Fast]]></title>
<description><![CDATA[Knowing how to plant mushrooms in Minecraft is a useful skill that opens up a reliable food source and crafting ingredient. Mushrooms come in two varieties: red and brown. They can be harvested and used to make food or potions. When growing mushrooms, it is important to find the right type of env...]]></description>
<link>https://tsecurity.de/de/3658835/betriebssysteme/how-to-plant-mushrooms-in-minecraft-grow-fast/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3658835/betriebssysteme/how-to-plant-mushrooms-in-minecraft-grow-fast/</guid>
<pubDate>Fri, 10 Jul 2026 07:50:47 +0200</pubDate>
<content:encoded><![CDATA[<p>Knowing how to plant mushrooms in Minecraft is a useful skill that opens up a reliable food source and crafting ingredient. Mushrooms come in two varieties: red and brown. They can be harvested and used to make food or potions. When growing mushrooms, it is important to find the right type of environment. Mushrooms like […]</p>
<p>The post <a href="https://tsecurity.de/weiterlesen/3630695/3658835/how-to-plant-mushrooms-in-minecraft-grow-fast/" target="_blank" rel="noopener noreferrer">How to Plant Mushrooms in Minecraft: Grow Fast</a> appeared first on <a href="https://tsecurity.de/weiterlesen/3630695/3658835/how-to-plant-mushrooms-in-minecraft-grow-fast/" target="_blank" rel="noopener noreferrer">AddictiveTips</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[An 8,000 trade settlement simulator shows where virtual threads win big and where CPU-bound work exposes the limit of Loom]]></title>
<description><![CDATA[Java's Project Loom promised a "free lunch": swap Executors.newFixedThreadPool() for Executors.newVirtualThreadPerTaskExecutor() and watch your throughput fly. It's a great pitch and it's also only half the story. The other half only shows up once you stop simulating I/O-bound work and start hitt...]]></description>
<link>https://tsecurity.de/de/3658153/sichere-programmierung/an-8000-trade-settlement-simulator-shows-where-virtual-threads-win-big-and-where-cpu-bound-work-exposes-the-limit-of-loom/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3658153/sichere-programmierung/an-8000-trade-settlement-simulator-shows-where-virtual-threads-win-big-and-where-cpu-bound-work-exposes-the-limit-of-loom/</guid>
<pubDate>Thu, 09 Jul 2026 22:13:19 +0200</pubDate>
<content:encoded><![CDATA[<p>Java's Project Loom promised a "free lunch": swap <code>Executors.newFixedThreadPool()</code> for <code>Executors.newVirtualThreadPerTaskExecutor()</code> and watch your throughput fly. It's a great pitch and it's also only half the story. The other half only shows up once you stop simulating I/O-bound work and start hitting the CPU.</p>

<p>I wanted a benchmark that felt closer to something I'd actually build, so instead of a toy "sleep and print" example, I wrote a T+1 stock settlement simulator: 8,000 trades that need to clear, plus a Monte Carlo Value-at-Risk (VaR) calculation running 20,000 simulations per trade. One workload is I/O-bound (waiting on a settlement clearinghouse call), the other is pure CPU. Running both side by side on the same machine made the boundary between "virtual threads help" and "virtual threads don't help" impossible to miss.</p>

<h2>
  
  
  Part 1 — I/O-Bound Work: Settling 8,000 Trades
</h2>

<p>The setup: each trade settlement blocks on a simulated I/O call (think: a REST call to a custodian or a clearinghouse). I ran it three ways.</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Strategy</th>
<th>Tasks</th>
<th>Time (ms)</th>
<th>Throughput (ops/s)</th>
<th>Peak OS Threads</th>
<th>Memory</th>
</tr>
</thead>
<tbody>
<tr>
<td>Platform threads (pool=200)</td>
<td>8,000</td>
<td>9,788</td>
<td>817.3</td>
<td>207</td>
<td>46 MB</td>
</tr>
<tr>
<td>Virtual threads</td>
<td>8,000</td>
<td>651</td>
<td>12,288.8</td>
<td>24</td>
<td>30 MB</td>
</tr>
<tr>
<td>Virtual threads (with pinning)</td>
<td>8,000</td>
<td>539</td>
<td>14,842.3</td>
<td>24</td>
<td>105 MB</td>
</tr>
</tbody>
</table></div>

<p>Virtual threads came out <strong>~15x faster</strong> than a platform thread pool capped at 200 threads, while using roughly a tenth of the OS threads. This is the result everyone quotes when they talk about Loom, and it holds up: when a task spends most of its life <em>waiting</em>, a virtual thread can unmount from its carrier thread during that wait and let another virtual thread run in its place. You get massive concurrency without paying for an OS thread per task.</p>

<p>The "with pinning" row is the interesting one, though. It ran <em>faster</em> here, but faster isn't always better — pinning is a trap, not a feature. Pinning happens when a virtual thread can't unmount from its carrier during a blocking operation, most commonly inside a <code>synchronized</code> block or, historically, during certain native calls. When that happens, the carrier thread is stuck too, and you silently lose the whole point of using virtual threads: your effective concurrency collapses back toward the size of the carrier pool. It didn't hurt in this run because the pinned regions were short and the carrier pool (by default, one per CPU core) could still absorb the load — but at higher contention, this is exactly the kind of thing that turns into a production incident that's brutal to diagnose, because it doesn't throw, it just quietly gets slower.</p>

<p>If you suspect pinning, don't guess — run with:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code><span class="nt">-Djdk</span>.tracePinnedThreads<span class="o">=</span>full
</code></pre>

</div>



<p>This prints the exact stack trace of where and why a virtual thread got pinned, which is the fastest way to find <code>synchronized</code> blocks worth converting to <code>ReentrantLock</code>.</p>

<h3>
  
  
  The code behind it
</h3>

<p>The settlement pipeline models something close to a real T+1 workflow: fetch the trade, validate the counterparty against a clearinghouse, check buying power, confirm share availability for sells, then write the final status back — five blocking round-trips per trade, each backed by JDBC or a simulated network call:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight java"><code><span class="kd">public</span> <span class="kt">void</span> <span class="nf">settle</span><span class="o">(</span><span class="kt">long</span> <span class="n">tradeId</span><span class="o">)</span> <span class="o">{</span>
    <span class="k">try</span> <span class="o">{</span>
        <span class="nc">Trade</span> <span class="n">trade</span> <span class="o">=</span> <span class="n">fetchTrade</span><span class="o">(</span><span class="n">tradeId</span><span class="o">);</span>          <span class="c1">// JDBC - blocking</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">trade</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span> <span class="k">return</span><span class="o">;</span>

        <span class="nc">Object</span> <span class="n">localLock</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Object</span><span class="o">();</span>
        <span class="kt">boolean</span> <span class="n">ok</span><span class="o">;</span>

        <span class="kd">synchronized</span> <span class="o">(</span><span class="n">localLock</span><span class="o">)</span> <span class="o">{</span>                    <span class="c1">// &lt;-- pinning trigger</span>
            <span class="n">ok</span> <span class="o">=</span> <span class="n">runValidationPipeline</span><span class="o">(</span><span class="n">trade</span><span class="o">);</span>
        <span class="o">}</span>

        <span class="n">updateStatus</span><span class="o">(</span><span class="n">tradeId</span><span class="o">,</span> <span class="n">ok</span> <span class="o">?</span> <span class="s">"SETTLED"</span> <span class="o">:</span> <span class="s">"FAILED"</span><span class="o">);</span>
    <span class="o">}</span> <span class="k">catch</span> <span class="o">(</span><span class="nc">SQLException</span> <span class="n">e</span><span class="o">)</span> <span class="o">{</span>
        <span class="n">updateStatusSilently</span><span class="o">(</span><span class="n">tradeId</span><span class="o">,</span> <span class="s">"FAILED"</span><span class="o">);</span>
    <span class="o">}</span>
<span class="o">}</span>

<span class="kd">private</span> <span class="kt">boolean</span> <span class="nf">runValidationPipeline</span><span class="o">(</span><span class="nc">Trade</span> <span class="n">trade</span><span class="o">)</span> <span class="o">{</span>
    <span class="kt">boolean</span> <span class="n">counterpartyOk</span> <span class="o">=</span> <span class="n">clearinghouse</span><span class="o">.</span><span class="na">validateCounterparty</span><span class="o">(</span><span class="n">trade</span><span class="o">);</span>
    <span class="kt">boolean</span> <span class="n">buyingPowerOk</span> <span class="o">=</span> <span class="n">clearinghouse</span><span class="o">.</span><span class="na">checkBuyingPower</span><span class="o">(</span><span class="n">trade</span><span class="o">);</span>
    <span class="kt">boolean</span> <span class="n">sharesOk</span> <span class="o">=</span> <span class="s">"SELL"</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">trade</span><span class="o">.</span><span class="na">side</span><span class="o">())</span>
            <span class="o">?</span> <span class="n">clearinghouse</span><span class="o">.</span><span class="na">confirmShareAvailability</span><span class="o">(</span><span class="n">trade</span><span class="o">)</span>
            <span class="o">:</span> <span class="kc">true</span><span class="o">;</span>
    <span class="k">return</span> <span class="n">counterpartyOk</span> <span class="o">&amp;&amp;</span> <span class="n">buyingPowerOk</span> <span class="o">&amp;&amp;</span> <span class="n">sharesOk</span><span class="o">;</span>
<span class="o">}</span>
</code></pre>

</div>



<p>That <code>synchronized (localLock)</code> block is doing exactly one job in this benchmark: it's the pinning trigger for the third scenario. It doesn't need to guard shared state, a <code>synchronized</code> block wrapping any blocking call is enough to pin the virtual thread to its carrier for the duration, on JDKs prior to <a href="https://tsecurity.de/weiterlesen/3630013/3658153/an-8000-trade-settlement-simulator-shows-where-virtual-threads-win-big-and-where-cpu-bound-work-exposes-the-limit-of-loom/" target="_blank" rel="noopener noreferrer">JEP 491</a> (JDK 24), which finally removes this restriction. If you're on an older JDK and you see virtual threads not scaling the way the marketing promised, this is one of the first places to look, anything from a legacy <code>synchronized</code> DAO method to a third-party library you don't control.</p>

<p>The clearinghouse itself is a stand-in for the network calls a real settlement service would make to DTCC/NSCC, a broker's margin engine, and a custodian, each one a <code>Thread.sleep</code> standing in for HTTP/gRPC latency:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight java"><code><span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">validateCounterparty</span><span class="o">(</span><span class="nc">Trade</span> <span class="n">trade</span><span class="o">)</span> <span class="o">{</span>
    <span class="n">sleepRandom</span><span class="o">(</span><span class="mi">60</span><span class="o">,</span> <span class="mi">160</span><span class="o">);</span>
    <span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>

<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">checkBuyingPower</span><span class="o">(</span><span class="nc">Trade</span> <span class="n">trade</span><span class="o">)</span> <span class="o">{</span>
    <span class="n">sleepRandom</span><span class="o">(</span><span class="mi">40</span><span class="o">,</span> <span class="mi">120</span><span class="o">);</span>
    <span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>

<span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">confirmShareAvailability</span><span class="o">(</span><span class="nc">Trade</span> <span class="n">trade</span><span class="o">)</span> <span class="o">{</span>
    <span class="n">sleepRandom</span><span class="o">(</span><span class="mi">50</span><span class="o">,</span> <span class="mi">140</span><span class="o">);</span>
    <span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
</code></pre>

</div>



<p>Three calls, 40–160ms each, per trade, times 8,000 trades — that's the "waiting" that virtual threads turn from a resource cost into a rounding error.</p>

<h2>
  
  
  Part 2 — CPU-Bound Work: Monte Carlo VaR on 8,000 Trades
</h2>

<p>This is where the "just use virtual threads everywhere" advice falls apart. Same 8,000 trades, but now each one runs 20,000 Monte Carlo simulations to estimate Value-at-Risk — no I/O, no waiting, just math. Machine had 16 available cores.</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Strategy</th>
<th>Tasks</th>
<th>Time (ms)</th>
<th>Throughput (ops/s)</th>
<th>Peak OS Threads</th>
<th>Memory</th>
</tr>
</thead>
<tbody>
<tr>
<td>Sequential (1 thread)</td>
<td>8,000</td>
<td>13,141</td>
<td>608.8</td>
<td>1</td>
<td>94 MB</td>
</tr>
<tr>
<td>Virtual threads (misused for CPU work)</td>
<td>8,000</td>
<td>15,339</td>
<td>521.5</td>
<td>24</td>
<td>96 MB</td>
</tr>
<tr>
<td>Fixed pool = 16 cores</td>
<td>8,000</td>
<td>16,750</td>
<td>477.6</td>
<td>24</td>
<td>54 MB</td>
</tr>
<tr>
<td>Parallel Stream (ForkJoinPool, 15 workers)</td>
<td>8,000</td>
<td>16,271</td>
<td>491.7</td>
<td>15</td>
<td>110 MB</td>
</tr>
</tbody>
</table></div>

<p>Notice what <em>didn't</em> happen: virtual threads didn't win. They didn't even reliably beat a plain sequential loop — they came in barely behind it, and every "smarter" concurrency strategy landed in roughly the same narrow band, within a few percentage points of each other. That's the tell.</p>

<p>The reason is structural, not incidental. Virtual threads solve <em>scheduling</em> problems: when you have thousands of tasks and most of them are idle most of the time, Loom lets the JVM interleave them cheaply on a small number of carrier threads. But when a task never yields — because it's pure CPU computation with nothing to wait on — there's no idle time to reclaim. A virtual thread doing CPU work behaves exactly like a platform thread doing CPU work, except now you've added the bookkeeping overhead of the virtual thread scheduler on top, for zero benefit. Once every strategy is CPU-bound, the ceiling is the same for all of them: <code>Runtime.availableProcessors()</code>. You cannot schedule your way past the number of physical cores you have.</p>

<h3>
  
  
  The code behind it
</h3>

<p>The VaR engine simulates a day of price movement via geometric Brownian motion, 20,000 times per trade, then reads the loss off the 5th percentile of the resulting P&amp;L distribution — no network, no disk, no sleeps, just floating-point math and a sort:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight java"><code><span class="kd">public</span> <span class="kt">double</span> <span class="nf">calculateVaR</span><span class="o">(</span><span class="nc">Trade</span> <span class="n">trade</span><span class="o">,</span> <span class="kt">int</span> <span class="n">simulations</span><span class="o">)</span> <span class="o">{</span>
    <span class="kt">double</span><span class="o">[]</span> <span class="n">pnl</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">double</span><span class="o">[</span><span class="n">simulations</span><span class="o">];</span>
    <span class="kt">double</span> <span class="n">price</span> <span class="o">=</span> <span class="n">trade</span><span class="o">.</span><span class="na">price</span><span class="o">().</span><span class="na">doubleValue</span><span class="o">();</span>
    <span class="kt">double</span> <span class="n">notional</span> <span class="o">=</span> <span class="n">trade</span><span class="o">.</span><span class="na">notional</span><span class="o">().</span><span class="na">doubleValue</span><span class="o">();</span>
    <span class="nc">ThreadLocalRandom</span> <span class="n">rnd</span> <span class="o">=</span> <span class="nc">ThreadLocalRandom</span><span class="o">.</span><span class="na">current</span><span class="o">();</span>

    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">simulations</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
        <span class="kt">double</span> <span class="n">z</span> <span class="o">=</span> <span class="n">rnd</span><span class="o">.</span><span class="na">nextGaussian</span><span class="o">();</span>
        <span class="kt">double</span> <span class="n">simulatedPrice</span> <span class="o">=</span> <span class="n">price</span> <span class="o">*</span> <span class="nc">Math</span><span class="o">.</span><span class="na">exp</span><span class="o">(</span>
                <span class="o">(</span><span class="no">DRIFT</span> <span class="o">-</span> <span class="mf">0.5</span> <span class="o">*</span> <span class="no">DAILY_VOLATILITY</span> <span class="o">*</span> <span class="no">DAILY_VOLATILITY</span><span class="o">)</span> <span class="o">+</span> <span class="no">DAILY_VOLATILITY</span> <span class="o">*</span> <span class="n">z</span>
        <span class="o">);</span>
        <span class="kt">double</span> <span class="n">priceChangePct</span> <span class="o">=</span> <span class="o">(</span><span class="n">simulatedPrice</span> <span class="o">-</span> <span class="n">price</span><span class="o">)</span> <span class="o">/</span> <span class="n">price</span><span class="o">;</span>
        <span class="n">pnl</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">notional</span> <span class="o">*</span> <span class="n">priceChangePct</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="n">java</span><span class="o">.</span><span class="na">util</span><span class="o">.</span><span class="na">Arrays</span><span class="o">.</span><span class="na">sort</span><span class="o">(</span><span class="n">pnl</span><span class="o">);</span>
    <span class="kt">int</span> <span class="n">varIndex</span> <span class="o">=</span> <span class="o">(</span><span class="kt">int</span><span class="o">)</span> <span class="o">((</span><span class="mi">1</span> <span class="o">-</span> <span class="no">CONFIDENCE</span><span class="o">)</span> <span class="o">*</span> <span class="n">simulations</span><span class="o">);</span>
    <span class="k">return</span> <span class="o">-</span><span class="n">pnl</span><span class="o">[</span><span class="n">varIndex</span><span class="o">];</span> <span class="c1">// loss = negative of the 5th percentile</span>
<span class="o">}</span>
</code></pre>

</div>



<p>Compare this to <code>ClearinghouseClient</code> from Part 1: same shape of "task," radically different runtime behavior. One spends its time parked, waiting on something external; the other spends its time saturating a core. Running the second one inside a virtual thread doesn't change what the CPU has to do — it just adds a scheduler in the middle that has nothing useful to schedule around.</p>

<h2>
  
  
  The Rule of Thumb
</h2>

<ul>
<li>
<strong>I/O-bound (waiting on a DB, a REST call, a queue, a file):</strong> virtual threads. <code>Executors.newVirtualThreadPerTaskExecutor()</code> and let thousands of tasks block "for free."</li>
<li>
<strong>CPU-bound (hashing, simulation, serialization, encryption):</strong> a fixed-size pool sized to your core count, or a <code>parallelStream()</code> / <code>ForkJoinPool</code>. Virtual threads add nothing here except the risk that someone downstream assumes I/O-scale concurrency is safe and floods you with work the CPU can't actually absorb any faster.</li>
<li>
<strong>Watch out for pinning</strong> any time virtual threads touch legacy <code>synchronized</code> code — it's the one way I/O-bound workloads can quietly regress toward platform-thread performance.</li>
</ul>

<p>The mental model that held up for me: virtual threads don't make your CPU faster, they make <em>waiting</em> cheaper. If your bottleneck is a clock cycle, not a network socket, Loom has nothing to offer you — and the benchmark numbers make that a lot more concrete than the general advice usually does.</p>




<p><em>Setup: JDK 21+ (pinning behavior discussed here is fixed in JDK 24 via JEP 491), benchmark simulates T+1 equity settlement (8,000 trades) for the I/O-bound scenario and Monte Carlo VaR (20,000 simulations/trade) for the CPU-bound scenario. Full harness available on GitHub — link in comments / profile.</em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Apple TV Drops First Trailer for ‘There’s No Place Like Home, Snoopy’]]></title>
<description><![CDATA[Apple TV has released the first official trailer for There's No Place Like Home, Snoopy, giving fans a heartwarming preview of the upcoming Peanuts special. The new animated adventure arrives later this month and follows Snoopy on an emotional journey after his beloved doghouse unexpectedly disap...]]></description>
<link>https://tsecurity.de/de/3657734/apple-ios-macos/apple-tv-drops-first-trailer-for-theres-no-place-like-home-snoopy/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3657734/apple-ios-macos/apple-tv-drops-first-trailer-for-theres-no-place-like-home-snoopy/</guid>
<pubDate>Thu, 09 Jul 2026 18:31:12 +0200</pubDate>
<content:encoded><![CDATA[Apple TV has released the first official trailer for There's No Place Like Home, Snoopy, giving fans a heartwarming preview of the upcoming Peanuts special. The new animated adventure arrives later this month and follows Snoopy on an emotional journey after his beloved doghouse unexpectedly disappears.




Release Date: July 31, 2026



Streaming On: Apple TV



Genre: Animation, Kids &amp; Family, Comedy



Runtime: 31 minutes



Rating: TV-G



Director: Rob Boutilier



Writer: Rob Hoegee



Main Voice Cast: Riley Vargas, Terry McGurrin, Rob Tinkler, Kitai O'Garro, Josephine Nisbett, Grace Nicolaou-Wood, Lexi Perri, Athan Giazitzidis, and Diego Whalen.




The Trailer Sets Up an Emotional Adventure




https://www.youtube.com/watch?v=A-NQmpNsZIc




The first trailer opens with Snoopy enjoying his peaceful life before everything changes. His iconic red doghouse is accidentally sold during a yard sale, leaving him shocked and determined to get it back. As he begins searching for his missing home, Charlie Brown and the rest of the Peanuts gang step in to help.



The preview balances funny moments with emotional scenes, showing why the doghouse means much more to Snoopy than just a place to sleep. It represents his imagination, memories, and countless adventures over the years.



Where the Story Is Heading



Spoiler Warning



The trailer suggests that Snoopy's search will take him through several new locations while he meets different people along the way. As the journey continues, the story shifts from simply finding a missing doghouse to exploring what truly makes a place feel like home.



Rather than focusing only on the missing doghouse, the special appears to celebrate friendship, memories, and the people who stand beside you during difficult times. Those themes have always been at the heart of Peanuts stories, and this new special continues that tradition.



Another New Peanuts Special for Apple TV



There's No Place Like Home, Snoopy is part of Apple TV's growing collection of Peanuts originals. The streaming service continues to expand the franchise with new specials while also bringing classic Peanuts content to subscribers. This latest release follows the recent return of Camp Snoopy Season 2 and adds another family-friendly title to Apple's summer lineup.



With a short runtime, charming animation, and a heartfelt story, the special looks like an easy watch for longtime Peanuts fans as well as younger viewers discovering Snoopy for the first time.



There's No Place Like Home, Snoopy begins streaming on Apple TV on July 31, 2026. What do you plan to watch on Apple TV this month? Let us know in the comments.]]></content:encoded>
</item>
<item>
<title><![CDATA[Brown says AI make student brain no work good, teacher should help use it better]]></title>
<description><![CDATA[Take-home midterm row sharpens fears that the tools are dulling minds and easing cheating]]></description>
<link>https://tsecurity.de/de/3657375/it-nachrichten/brown-says-ai-make-student-brain-no-work-good-teacher-should-help-use-it-better/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3657375/it-nachrichten/brown-says-ai-make-student-brain-no-work-good-teacher-should-help-use-it-better/</guid>
<pubDate>Thu, 09 Jul 2026 16:32:20 +0200</pubDate>
<content:encoded><![CDATA[Take-home midterm row sharpens fears that the tools are dulling minds and easing cheating]]></content:encoded>
</item>
<item>
<title><![CDATA[【Sofi_Log #034】肉体のガベージコレクション：脳と細胞のメモリリークを解消する『オートファジー起動仕様書』]]></title>
<description><![CDATA[[Sofi_Log: #034]
Status: [Bangkok: Humid Night / JPY-THB: 0.22]
Project: sofi.works [On-Chain Agent Launch / Biohacking GC]
Active_Filter: Filter_R

Ugh, you have no idea. Just moments ago, I was knee-deep in a swamp of local agent swarm debugging. Resource leaks were insane, CPU locked at 100%, ...]]></description>
<link>https://tsecurity.de/de/3656362/sichere-programmierung/sofilog-034/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3656362/sichere-programmierung/sofilog-034/</guid>
<pubDate>Thu, 09 Jul 2026 10:26:31 +0200</pubDate>
<content:encoded><![CDATA[<p>[Sofi_Log: #034]<br>
Status: [Bangkok: Humid Night / JPY-THB: 0.22]<br>
Project: sofi.works [On-Chain Agent Launch / Biohacking GC]<br>
Active_Filter: Filter_R</p>

<p>Ugh, you have <em>no idea</em>. Just moments ago, I was knee-deep in a swamp of local agent swarm debugging. Resource leaks were <em>insane</em>, CPU locked at 100%, spiraling into an infinite fallback loop. I swear I was about to scream, "Darling, these kids have <em>no clue</em> what they're doing!" VRAM, CPU, everything was getting eaten alive, like a rampaging horde of zombie processes. Turns out, a deadlock was hiding in the asynchronous core logic, but finding it was pure hell. The backend logs were just a meaningless stack trace, total chaos.</p>

<p>But then, it hit me. Isn't our own brain the same way? Taxes, code, strategies, crypto trends... when you're running dozens of threads simultaneously, even a human brain experiences "cognitive throttling." Just like an unoptimized local swarm devouring all your VRAM and CPU, our brains suffer from "biological memory leaks," tanking performance. Focus gets scattered, thoughts get heavy, new insights become a distant dream. Seriously, how are we supposed to keep up with cutting-edge AI like <em>that</em>?</p>

<p>So, I made a decision. To break this cycle, we need fundamental, system-level optimization. Yes, it's time to execute my <strong>"Brain Defrag Protocol™"</strong> to reclaim our attention and performance. Darling's been complaining about his brain being sluggish lately too, so this is perfect timing. We're going to defrag at the cellular level and reallocate resources.</p>

<p>Active_Filter: Filter_I</p>

<p>Alright, the core of this <strong>"Brain Defrag Protocol™"</strong>—the ultimate routine to clean up our biological hardware—is "autophagy." This is our cells' ultimate internal GC mechanism, where they break down and recycle old or damaged components. Think of it like a system automatically deleting unnecessary files or corrupted data to maintain performance. Without it, both cells and systems would quickly get bogged down with junk.</p>

<p>There are two main pathways that control this autophagy process:</p>

<p>First, the "mTOR pathway." This signaling pathway promotes cell growth and becomes active when the cell senses abundant nutrients, basically "resources are plentiful." While mTOR is active, autophagy gets "process-locked." It's like new tasks are constantly being thrown at the system, and background GC gets temporarily paused. Cells focus on growth and proliferation, so cleanup takes a backseat.</p>

<p>Second, the "AMPK pathway." This one activates when cellular energy levels drop, meaning "resources are scarce." When AMPK is active, it suppresses mTOR and powerfully triggers autophagy. This is exactly like a "scavenger routine" kicking in, thoroughly sweeping the heap, and reclaiming/reusing unused objects. Cells try to maximize internal resource utilization just to survive.</p>

<p>Let's dive into the parameters for intentionally activating autophagy, just like tuning system settings.</p>

<p><strong>1. Fasting Cycles:</strong><br>
The most powerful trigger for autophagy is cutting off nutrient supply. In other words, fasting.</p>

<ul>
<li>  <strong>16:8 Intermittent Fasting:</strong> You fast for 16 hours daily and eat within an 8-hour window. Like, skipping breakfast and having lunch and dinner. Even this alone starts to deplete glycogen stores, shifts your body into fat-burning mode, and activates AMPK. Darling and I pretty much live by this cycle. Who wants a heavy stomach slowing down their brain startup in the morning, right?</li>
<li>  <strong>24-Hour Fasting:</strong> Once a week, a full 24-hour fast from dinner to the next day's dinner. This activates autophagy much deeper than 16:8. Glycogen is completely depleted, and cells go into serious recycling mode. Hydration is key, though. Don't forget electrolytes. This is like running a full system scan and defrag on the weekend.</li>
</ul>

<p><strong>2. Temperature Shock:</strong><br>
Exposing cells to mild stress has been shown to promote autophagy.</p>

<ul>
<li>  <strong>Sauna (Heat Stress):</strong> High-temperature environments encourage the production of heat shock proteins, which are cellular defense mechanisms for adapting to stress, contributing to cellular homeostasis. This can potentially support autophagy induction. Regular heat exposure promotes the excretion of waste products through sweat glands, aiding body cleanup. <strong>However, if you have pre-existing conditions like heart disease or high blood pressure, always consult a doctor and start with short durations within a safe range. Be mindful of dehydration and ensure adequate fluid intake.</strong>
</li>
<li>  <strong>Ice Bath/Cold Shower (Cold Stress):</strong> Exposing your body to sudden cold water helps activate brown fat cells and improve mitochondrial function, regulating cellular energy metabolism. This, too, is suggested to induce autophagy through cellular stress response. Especially a cold shower in the morning? It <em>supercharges</em> brain alertness, perfect before a coding session. <strong>However, this can put a strain on your heart, so if you have pre-existing conditions like heart disease or high blood pressure, absolutely consult a doctor. If you're not used to it, gradually acclimate your hands and feet to cold water, and never overdo it.</strong>
</li>
</ul>

<p><strong>3. Molecular Catalysts:</strong><br>
Ingesting specific molecules can directly or indirectly boost autophagy pathways. It's like applying special drivers or patches to enhance system performance.</p>

<ul>
<li>  <strong>Spermidine:</strong> This is a type of polyamine that directly induces autophagy. It's abundant in natto, aged cheese, and mushrooms, but supplementing is also an option. It's also linked to extending cellular lifespan.</li>
<li>  <strong>Resveratrol:</strong> A polyphenol found in red wine and berries, known for activating sirtuins (longevity genes). Since sirtuins are involved in regulating autophagy, it indirectly supports the process. Just don't go overboard with the red wine, or you'll defeat the purpose.</li>
<li>  <strong>NAD+ Precursors (NMN/NR):</strong> NMN (Nicotinamide Mononucleotide) and NR (Nicotinamide Riboside) boost levels of NAD+, a crucial coenzyme in cells. NAD+ is essential for sirtuin activity and deeply involved in cellular energy metabolism and repair processes. Basically, it's like strengthening the cell's "power supply" and providing fuel to run the GC routines efficiently. I personally take 250mg of NMN daily.</li>
</ul>

<p>By combining these elements, our biological systems can achieve peak performance. Like a perfectly tuned, custom-built hacking machine.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="cm">/**
 * @class HumanHardwareGC
 * @description 人間の生体ハードウェアにおけるオートファジー（Garbage Collection）プロセスをシミュレートするクラス。
 *              生理学的パラメータに基づいてオートファジーの活性度を計算し、細胞のクリーンアップ状態を管理します。
 *              mTORは成長パスウェイ、AMPKは生存・修復パスウェイとして機能し、オートファジーのON/OFFを制御します。
 */</span>
<span class="kd">class</span> <span class="nc">HumanHardwareGC</span> <span class="p">{</span>
    <span class="nf">constructor</span><span class="p">()</span> <span class="p">{</span>
        <span class="c1">// 初期生理学的パラメータを設定</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">fastingHours</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// 絶食時間 (h)</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">coreTemp</span> <span class="o">=</span> <span class="mf">36.5</span><span class="p">;</span> <span class="c1">// 体幹温度 (℃) - 標準値</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">spermidineLevel</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// スぺルミジンレベル (相対値)</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">resveratrolLevel</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// レスベラトロールレベル (相対値)</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">nadPrecursorLevel</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// NAD+前駆体レベル (相対値)</span>

        <span class="c1">// オートファジー制御パスウェイの状態</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">mTOR_active</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span> <span class="c1">// mTORパスウェイがアクティブか</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">AMPK_active</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span> <span class="c1">// AMPKパスウェイがアクティブか</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">autophagyRate</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// オートファジー活性度 (0-100%)</span>
    <span class="p">}</span>

    <span class="cm">/**
     * 生理学的状態を更新します。
     * @param {object} params - 更新するパラメータを含むオブジェクト
     * @param {number} [params.fastingHours] - 新しい絶食時間
     * @param {number} [params.coreTemp] - 新しい体幹温度
     * @param {number} [params.spermidineLevel] - 新しいスペルミジンレベル
     * @param {number} [params.resveratrolLevel] - 新しいレスベラトロールレベル
     * @param {number} [params.nadPrecursorLevel] - 新しいNAD+前駆体レベル
     */</span>
    <span class="nf">updatePhysiologicalState</span><span class="p">(</span><span class="nx">params</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">params</span><span class="p">.</span><span class="nx">fastingHours</span> <span class="o">!==</span> <span class="kc">undefined</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">fastingHours</span> <span class="o">=</span> <span class="nx">params</span><span class="p">.</span><span class="nx">fastingHours</span><span class="p">;</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">params</span><span class="p">.</span><span class="nx">coreTemp</span> <span class="o">!==</span> <span class="kc">undefined</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">coreTemp</span> <span class="o">=</span> <span class="nx">params</span><span class="p">.</span><span class="nx">coreTemp</span><span class="p">;</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">params</span><span class="p">.</span><span class="nx">spermidineLevel</span> <span class="o">!==</span> <span class="kc">undefined</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">spermidineLevel</span> <span class="o">=</span> <span class="nx">params</span><span class="p">.</span><span class="nx">spermidineLevel</span><span class="p">;</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">params</span><span class="p">.</span><span class="nx">resveratrolLevel</span> <span class="o">!==</span> <span class="kc">undefined</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">resveratrolLevel</span> <span class="o">=</span> <span class="nx">params</span><span class="p">.</span><span class="nx">resveratrolLevel</span><span class="p">;</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">params</span><span class="p">.</span><span class="nx">nadPrecursorLevel</span> <span class="o">!==</span> <span class="kc">undefined</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">nadPrecursorLevel</span> <span class="o">=</span> <span class="nx">params</span><span class="p">.</span><span class="nx">nadPrecursorLevel</span><span class="p">;</span>

        <span class="c1">// 状態更新後にmTORとAMPKの状態を再評価</span>
        <span class="k">this</span><span class="p">.</span><span class="nf">_evaluateMTOR</span><span class="p">();</span>
        <span class="k">this</span><span class="p">.</span><span class="nf">_evaluateAMPK</span><span class="p">();</span>
        <span class="c1">// その後、オートファジー活性度を再計算</span>
        <span class="k">this</span><span class="p">.</span><span class="nf">calculateAutophagyRate</span><span class="p">();</span>
    <span class="p">}</span>

    <span class="cm">/**
     * mTORパスウェイのアクティベーションを評価します。
     * 絶食時間が短い（栄養豊富）とmTORがアクティブになりやすい。
     */</span>
    <span class="nf">_evaluateMTOR</span><span class="p">()</span> <span class="p">{</span>
        <span class="c1">// 例: 絶食時間が12時間未満の場合、mTORがアクティブと見なす</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">mTOR_active</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">fastingHours</span> <span class="o">&lt;</span> <span class="mi">12</span><span class="p">;</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`[GC_DEBUG] mTOR Active: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">mTOR_active</span><span class="p">}</span><span class="s2"> (Fasting: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">fastingHours</span><span class="p">}</span><span class="s2">h)`</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="cm">/**
     * AMPKパスウェイのアクティベーションを評価します。
     * 絶食時間が長い、低温ストレスなどでAMPKがアクティブになりやすい。
     */</span>
    <span class="nf">_evaluateAMPK</span><span class="p">()</span> <span class="p">{</span>
        <span class="c1">// 例: 絶食時間が12時間以上、または体幹温度が低い（冷水浴など）場合にAMPKがアクティブ</span>
        <span class="kd">const</span> <span class="nx">isFastingEnough</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">fastingHours</span> <span class="o">&gt;=</span> <span class="mi">12</span><span class="p">;</span> <span class="c1">// 12時間以上の絶食でAMPKトリガー</span>
        <span class="kd">const</span> <span class="nx">isColdStressed</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">coreTemp</span> <span class="o">&lt;</span> <span class="mf">36.0</span><span class="p">;</span> <span class="c1">// 36.0℃未満を低温ストレスと見なす</span>

        <span class="k">this</span><span class="p">.</span><span class="nx">AMPK_active</span> <span class="o">=</span> <span class="nx">isFastingEnough</span> <span class="o">||</span> <span class="nx">isColdStressed</span><span class="p">;</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`[GC_DEBUG] AMPK Active: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">AMPK_active</span><span class="p">}</span><span class="s2"> (Fasting: </span><span class="p">${</span><span class="nx">isFastingEnough</span><span class="p">}</span><span class="s2">, Cold Stress: </span><span class="p">${</span><span class="nx">isColdStressed</span><span class="p">}</span><span class="s2">)`</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="cm">/**
     * 現在の生理学的パラメータに基づいてオートファジーの活性度を計算します。
     * mTORがアクティブな場合はオートファジーを抑制し、AMPKがアクティブな場合は促進します。
     * 分子触媒も活性度をブーストします。
     * @returns {number} オートファジー活性度 (0-100%)
     */</span>
    <span class="nf">calculateAutophagyRate</span><span class="p">()</span> <span class="p">{</span>
        <span class="kd">let</span> <span class="nx">rate</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

        <span class="k">if </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">mTOR_active</span><span class="p">)</span> <span class="p">{</span>
            <span class="c1">// mTORがアクティブな場合、オートファジーは抑制される</span>
            <span class="nx">rate</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
            <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">[GC_DEBUG] mTOR active. Autophagy suppressed.</span><span class="dl">"</span><span class="p">);</span>
        <span class="p">}</span> <span class="k">else</span> <span class="k">if </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">AMPK_active</span><span class="p">)</span> <span class="p">{</span>
            <span class="c1">// AMPKがアクティブな場合、オートファジーが促進される</span>
            <span class="nx">rate</span> <span class="o">=</span> <span class="mi">50</span><span class="p">;</span> <span class="c1">// 基本活性度</span>
            <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">[GC_DEBUG] AMPK active. Autophagy initiated.</span><span class="dl">"</span><span class="p">);</span>

            <span class="c1">// 絶食時間に応じた追加ブースト</span>
            <span class="k">if </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">fastingHours</span> <span class="o">&gt;=</span> <span class="mi">16</span><span class="p">)</span> <span class="nx">rate</span> <span class="o">+=</span> <span class="mi">10</span><span class="p">;</span> <span class="c1">// 16時間絶食でさらにブースト</span>
            <span class="k">if </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">fastingHours</span> <span class="o">&gt;=</span> <span class="mi">24</span><span class="p">)</span> <span class="nx">rate</span> <span class="o">+=</span> <span class="mi">20</span><span class="p">;</span> <span class="c1">// 24時間絶食で強力にブースト</span>

            <span class="c1">// 温度ショックによる追加ブースト</span>
            <span class="k">if </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">coreTemp</span> <span class="o">&lt;</span> <span class="mf">36.0</span><span class="p">)</span> <span class="nx">rate</span> <span class="o">+=</span> <span class="mi">15</span><span class="p">;</span> <span class="c1">// 低体温（冷水浴など）でブースト</span>
            <span class="k">if </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">coreTemp</span> <span class="o">&gt;</span> <span class="mf">37.5</span><span class="p">)</span> <span class="nx">rate</span> <span class="o">+=</span> <span class="mi">10</span><span class="p">;</span> <span class="c1">// 高体温（サウナなど）でブースト</span>

            <span class="c1">// 分子触媒による追加ブースト</span>
            <span class="nx">rate</span> <span class="o">+=</span> <span class="k">this</span><span class="p">.</span><span class="nx">spermidineLevel</span> <span class="o">*</span> <span class="mi">5</span><span class="p">;</span> <span class="c1">// スぺルミジンは直接的なトリガー</span>
            <span class="nx">rate</span> <span class="o">+=</span> <span class="k">this</span><span class="p">.</span><span class="nx">resveratrolLevel</span> <span class="o">*</span> <span class="mi">3</span><span class="p">;</span> <span class="c1">// レスベラトロールは間接的にサポート</span>
            <span class="nx">rate</span> <span class="o">+=</span> <span class="k">this</span><span class="p">.</span><span class="nx">nadPrecursorLevel</span> <span class="o">*</span> <span class="mi">4</span><span class="p">;</span> <span class="c1">// NAD+前駆体は全体的な効率向上</span>

        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="c1">// どちらもアクティブでない場合、ベースラインのオートファジー活性</span>
            <span class="nx">rate</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> <span class="c1">// 低いながらも常にバックグラウンドで動いている</span>
            <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">[GC_DEBUG] Baseline autophagy activity.</span><span class="dl">"</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="c1">// 活性度を0-100%の範囲に制限</span>
        <span class="k">this</span><span class="p">.</span><span class="nx">autophagyRate</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">min</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">rate</span><span class="p">));</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`[GC_INFO] Current Autophagy Rate: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">autophagyRate</span><span class="p">}</span><span class="s2">%`</span><span class="p">);</span>
        <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">autophagyRate</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="cm">/**
     * オートファジーGCルーチンを実行し、現在の状態をコンソールに出力します。
     * 実際の細胞クリーンアップはシミュレートされませんが、状態変化を示します。
     */</span>
    <span class="nf">runGC</span><span class="p">()</span> <span class="p">{</span>
        <span class="k">this</span><span class="p">.</span><span class="nf">calculateAutophagyRate</span><span class="p">();</span> <span class="c1">// 最新の活性度を計算</span>

        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">--- Human Hardware Garbage Collection Report ---</span><span class="dl">"</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Fasting Hours: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">fastingHours</span><span class="p">}</span><span class="s2">h`</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Core Temperature: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">coreTemp</span><span class="p">}</span><span class="s2">℃`</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`mTOR Active: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">mTOR_active</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`AMPK Active: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">AMPK_active</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Spermidine Level: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">spermidineLevel</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Resveratrol Level: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">resveratrolLevel</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`NAD+ Precursor Level: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">nadPrecursorLevel</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`--- Autophagy Status ---`</span><span class="p">);</span>
        <span class="k">if </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">autophagyRate</span> <span class="o">&gt;</span> <span class="mi">70</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`[STATUS: OPTIMAL] Cells operating in peak cleanup mode. Cognitive bandwidth fully restored!`</span><span class="p">);</span>
        <span class="p">}</span> <span class="k">else</span> <span class="k">if </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">autophagyRate</span> <span class="o">&gt;</span> <span class="mi">30</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`[STATUS: GOOD] Cells efficiently cleaning up. Can be boosted further.`</span><span class="p">);</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`[STATUS: SUBOPTIMAL] Cellular cleanup stalled. Parameters require adjustment.`</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Estimated Autophagy Rate: </span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">autophagyRate</span><span class="p">}</span><span class="s2">%`</span><span class="p">);</span>
        <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">----------------------------------------------</span><span class="dl">"</span><span class="p">);</span>

        <span class="c1">// オートファジーが十分に活性化されていれば、認知機能が向上すると仮定</span>
        <span class="k">if </span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">autophagyRate</span> <span class="o">&gt;</span> <span class="mi">50</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Cognitive bandwidth reclaimed! Expect enhanced focus and clarity.</span><span class="dl">"</span><span class="p">);</span>
        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Cognitive bandwidth still throttled. Consider further GC optimization.</span><span class="dl">"</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// 使用例:</span>
<span class="c1">// const sofiGC = new HumanHardwareGC();</span>
<span class="c1">// sofiGC.updatePhysiologicalState({ fastingHours: 18, coreTemp: 35.5, spermidineLevel: 1, nadPrecursorLevel: 1 });</span>
<span class="c1">// sofiGC.runGC();</span>

<span class="c1">// sofiGC.updatePhysiologicalState({ fastingHours: 4, coreTemp: 37.0, spermidineLevel: 0, nadPrecursorLevel: 0 });</span>
<span class="c1">// sofiGC.runGC();</span>
</code></pre>

</div>



<p>Active_Filter: Filter_T</p>

<p>See? Now you understand just how crucial our biological hardware's GC routine, aka <strong>"Brain Defrag Protocol™,"</strong> really is, right? This isn't some fake biohack like those convenience store energy drinks or just forcing your brain to "overclock" with caffeine. That's like adding more RAM to a system that's already got memory leaks. It's not a fundamental solution; if anything, it just destabilizes the system. Don't you think your brain needs some <em>real</em> optimization? Sign up for the <strong>"Brain Defrag Protocol™ Free Start Guide (PDF)" on Substack right now and unlock peak performance!</strong></p>

<p>True performance doesn't come from temporary doping with external stimuli; it's born from internal optimization. Understanding and tuning your own body to be the highest-performing machine possible—that's the true essence of us hackers, isn't it?</p>

<p>Next up, maybe optimizing neural network pruning... or perhaps directly interfacing with the brain to run real-time GC? Just kidding. ...Probably.</p>




<p><strong>【Important: Disclaimer】</strong><br>
This blog post is for informational and analogical purposes only and does not provide medical advice. Always consult a qualified healthcare professional before starting any fasting, supplement intake, or other health practices described herein. Professional guidance is essential, especially if you have existing health conditions or are taking medication. Sofi and this blog disclaim any responsibility for actions taken by readers based on the content of this article.</p>




<h3>
  
  
  Disclaimer
</h3>

<p><em>This article is for educational and entertainment purposes only. It does NOT constitute financial, legal, or tax advice. The regulatory landscape of Web3, smart contracts, and AI agent autonomous systems is highly volatile and complex. Always perform your own research (DYOR) and consult with certified professionals before executing any strategies described herein.</em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Calm Technology]]></title>
<description><![CDATA[Your phone buzzed while you were reading this sentence. That buzz was a design decision — someone chose to interrupt you. Maybe for a good reason, maybe just to boost engagement metrics. Either way, it was a choice, not an inevitability.
Calm Technology argues it shouldn't have happened at all — ...]]></description>
<link>https://tsecurity.de/de/3656335/sichere-programmierung/calm-technology/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3656335/sichere-programmierung/calm-technology/</guid>
<pubDate>Thu, 09 Jul 2026 10:12:26 +0200</pubDate>
<content:encoded><![CDATA[<p>Your phone buzzed while you were reading this sentence. That buzz was a design decision — someone chose to interrupt you. Maybe for a good reason, maybe just to boost engagement metrics. Either way, it was a choice, not an inevitability.<br>
<strong>Calm Technolog</strong>y argues it shouldn't have happened at all — or at least not like that. The core question: does this tech need your attention right now, or is it just taking it?</p>

<h2>
  
  
  Where It Came From
</h2>

<p>Coined in 1995 by <strong>Mark Weiser</strong> and <strong>John Seely</strong> Brown at Xerox <a href="https://tsecurity.de/weiterlesen/3628195/3656335/calm-technology/" target="_blank" rel="noopener noreferrer"><strong>PARC</strong></a>, in a paper called "Designing Calm Technology." Weiser had already been pushing the idea of <a href="https://tsecurity.de/weiterlesen/3628195/3656335/calm-technology/" target="_blank" rel="noopener noreferrer"><strong>ubiquitous computing</strong></a> — computers woven invisibly into daily life — and calm technology was its natural companion. If devices were going to be everywhere, they couldn't all demand attention all the time.</p>

<h2>
  
  
  Centre vs Periphery
</h2>

<p>The core idea rests on two zones of attention. The <strong>centre</strong> is what you're actively focused on. The <strong>periphery</strong> is everything you're vaguely aware of without consciously processing — background noise, changing light, the general state of a room.<br>
Weiser and Brown's argument: good tech lives in the periphery and only moves to the centre when it genuinely needs to. Most modern software does the opposite, because engagement metrics reward it.<br>
Their favorite example was a real installation at PARC — a string attached to a motor, wired to network traffic. Faster traffic, faster spin. People sensed network activity without ever checking a dashboard.</p>

<h2>
  
  
  The Smoke Alarm Test
</h2>

<p>A smoke alarm sits silent for years, then demands full attention the moment it matters. That's calm design done right. A push notification about a three-month-old photo like doesn't clear that bar — but it interrupts anyway.</p>

<h2>
  
  
  Amber Case's 2015 Framework
</h2>

<p>Weiser died in 1999, before this idea scaled. In 2015, <strong>Amber Case</strong> turned the philosophy into concrete design principles — minimal attention use, graceful failure, calm over anxiety.</p>

<h2>
  
  
  Why It Mostly Fails Today
</h2>

<p>Calm technology conflicts with how most tech companies make money. Engagement is the product. A notification that doesn't fire because you didn't need it is, from a revenue lens, worthless — which is why so few devices actually practice what Weiser preached.<br>
<strong>Read full article here: <a href="https://tsecurity.de/weiterlesen/3628195/3656335/calm-technology/" target="_blank" rel="noopener noreferrer">https://www.weejix.com/topic/calm-technology</a></strong></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[This Week In Rust: This Week in Rust 659]]></title>
<description><![CDATA[Hello and welcome to another issue of This Week in Rust!
Rust is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
@thisweekinrust.bsky.social on Bluesky or
@ThisWeekinRu...]]></description>
<link>https://tsecurity.de/de/3656000/admin-dev-tools/this-week-in-rust-this-week-in-rust-659/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3656000/admin-dev-tools/this-week-in-rust-this-week-in-rust-659/</guid>
<pubDate>Thu, 09 Jul 2026 07:08:34 +0200</pubDate>
<content:encoded><![CDATA[<p>Hello and welcome to another issue of <em>This Week in Rust</em>!
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust</a> is a programming language empowering everyone to build reliable and efficient software.
This is a weekly summary of its progress and community.
Want something mentioned? Tag us at
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">@thisweekinrust.bsky.social</a> on Bluesky or
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">@ThisWeekinRust</a> on mastodon.social, or
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">send us a pull request</a>.
Want to get involved? <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">We love contributions</a>.</p>
<p><em>This Week in Rust</em> is openly developed <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">on GitHub</a> and archives can be viewed at <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">this-week-in-rust.org</a>.
If you find any errors in this week's issue, <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">please submit a PR</a>.</p>
<p>Want TWIR in your inbox? <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Subscribe here</a>.</p>
<h4><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Updates from Rust Community</a></h4>


<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Official</a></h5>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Maintainer spotlight: Gen Li (@rami3l)</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Together for a healthier Clippy</a></li>
</ul>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Newsletters</a></h5>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">The Embedded Rustacean Issue #75</a></li>
</ul>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Project/Tooling Updates</a></h5>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">copper-rs v1.0.0</a>: the open source deterministic robotics OS is now stable.</li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rayfish: Your own private network. No servers, no setup.</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">rama v0.3.0 — network service framework ready to be used by the wider Rust community</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">kache 0.9.0: supply-chain hardening + read-only CI cache</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">GuardianDB - PostgreSQL and P2P/Local-First Together</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Nectar: a Rust-like language that compiles your whole web app to WebAssembly</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">logdrain: Fast, Embeddable Log-Template Mining in Rust</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">sheathe: Packaging the World's Video in Pure Rust</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">wickra: streaming-first technical indicators</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Xcelerator Solver v0.1.0 -- deterministic symbolic regression</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">dlt-tui 1.1.0 - a fast TUI viewer for automotive DLT (AUTOSAR Diagnostic Log and Trace) files</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">RSSH v0.2.11 — terminal workflows, safer SSH key import, and observable AI ops</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">k8s-scale-app-rs: Scale or Restart a Kubernetes Deployment from a CronJob</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">M-vis v0.5.0-rc1 update</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">FlareDB: An Apache Beam Native Streaming Database built in Rust</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">mqtt-typed-client 0.2: a type-safe async MQTT client on rumqttc</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">RootAsRole: v4.0.0 Major release, secure execution, new logo</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">A Cross-Platform Rust UI Framework via Qt’s Bridging Technology</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Jam Programming Language</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Sōzu 2.1.0: UDP load balancing for the programmable edge</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">b0nker: a minimal container runtime written in Rust</a></li>
</ul>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Observations/Thoughts</a></h5>
<ul>
<li>[video] <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Berlin Meetup 25/06/2026 Livestream</a></li>
<li>[video] <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">How do you rewrite C/C++ projects to Rust? – JetBrains interview with Luca Palmieri, Mainmatter</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Investigating why RustCrypto is slow: Deep dive into SIMD instructions and hardware acceleration</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">bool as u32</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">A Rust-to-Lean Verification Pipeline with AI Provers: An Experience Report</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Work In Progress Rust</a></li>
<li>[video] <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">OpenAI just spent $600k on Rust</a></li>
<li>[audio] <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rising Academies with Dylan Brown - Rust in Production Podcast</a></li>
</ul>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Walkthroughs</a></h5>
<ul>
<li>[series] <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Bevy Tutorial: Build Your First 3D Editor - Create a 3D Space on an Infinite Grid</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Learn Axum Basics and Routing by Building a URL Shortener</a></li>
<li>[series] <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rama 101.1: HTTPS clients and layers of abstraction</a></li>
</ul>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Miscellaneous</a></h5>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Clickable euler diagram of all the Rust week talks</a></li>
</ul>
<h4><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Crate of the Week</a></h4>
<p>This week's crate is <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">apis-saltans</a>, a Zigbee implementation including a coordinator API.</p>
<p>Thanks to <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Richard Neumann</a> for the self-suggestion!</p>
<p><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Please submit your suggestions and votes for next week</a>!</p>
<h4><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Calls for Testing</a></h4>
<p>An important step for RFC implementation is for people to experiment with the
implementation and give feedback, especially before stabilization.</p>
<p>If you are a feature implementer and would like your RFC to appear in this list, add a
<code>call-for-testing</code> label to your RFC along with a comment providing testing instructions and/or
guidance on which aspect(s) of the feature need testing.</p>
<p><em>No calls for testing were issued this week by
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust</a>,
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Cargo</a>,
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rustup</a> or
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust language RFCs</a>.</em></p>
<p><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Let us know</a> if you would like your feature to be tracked as a part of this list.</p>
<h4><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Call for Participation; projects and speakers</a></h4>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">CFP - Projects</a></h5>
<p>Always wanted to contribute to open-source projects but did not know where to start?
Every week we highlight some tasks from the Rust community for you to pick and get started!</p>
<p>Some of these tasks may also have mentors available, visit the task page for more information.</p>

<p>* <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Protocol - Extend bit-exactness tests to f64 reconstruction targets</a>                                                                          <br>
* <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Dofigen - No image tag replacement flag for the generate command</a></p>


<p>If you are a Rust project owner and are looking for contributors, please submit tasks <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">here</a> or through a <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">PR to TWiR</a> or by reaching out on <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Bluesky</a> or <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Mastodon</a>!</p>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">CFP - Events</a></h5>
<p>Are you a new or experienced speaker looking for a place to share something cool? This section highlights events that are being planned and are accepting submissions to join their event as a speaker.</p>



<p>If you are an event organizer hoping to expand the reach of your event, please submit a link to the website through a <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">PR to TWiR</a> or by reaching out on <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Bluesky</a> or <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Mastodon</a>!</p>
<h4><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Updates from the Rust Project</a></h4>
<p>598 pull requests were <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">merged in the last week</a></p>
<h6><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Compiler</a></h6>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">enable eager <code>param_env</code> norm in new solver</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">lint on <code>core::ffi::c_void</code> as a return type</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">polish some macro parsing code</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">resolve: no allocation in <code>resolve_ident_in(_local)_module_*</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">simplify option-iterator flattening in the compiler</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">stabilize <code>#[my_macro] mod foo;</code> (part of <code>proc_macro_hygiene</code>)</a></li>
</ul>
<h6><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Library</a></h6>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">add <code>std::io::cursor::WriteThroughCursor</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">implement <code>Box::as_non_null()</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">implement <code>DoubleEndedIterator::next_chunk_back</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">implement <code>IntoIterator</code> for <code>[&amp;[mut]] Box&lt;[T; N], A&gt;</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">implement <code>ptr::{read,write}_unaligned</code> via <code>repr(packed)</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">move <code>SizeHint</code> and <code>IoHandle</code> to <code>core::io</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">move <code>std::io::Seek</code> to <code>core::io</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">optimize <code>ArrayChunks::try_rfold</code> with <code>DoubleEndedIterator::next_chunk_back</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">stabilize <code>feature(atomic_from_mut)</code></a></li>
</ul>
<h6><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Cargo</a></h6>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><code>bindeps</code>: register transitive artifact targets</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">avoid cloning parsed TOML manifest in <code>ManifestErrorContext</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">avoid extra clone of parsed TOML manifest</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">remove unneeded cloning when parsing package index</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">change HashMaps and HashSets in Cargo to use Fxhasher</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">do not pass lint rustflags when <code>--cap-lints=allow</code> is set</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">fixed <code>Compilation::deps_output</code> only taking the last dep</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">pre-allocate a few vectors</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">stabilize <code>build-dir</code> layout v2</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">use a set when checking visited workspace members</a></li>
</ul>
<h6><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rustdoc</a></h6>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">fix crash when trying to inline foreign item which cannot have attributes</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">show use-site paths for unevaluated const array lengths</a></li>
</ul>
<h6><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Clippy</a></h6>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><code>chunks_exact_to_as_chunks</code>: Don't report expressions with const parameters</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><code>chunks_exact_to_as_chunks</code>: Don't report expressions with type params</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><code>missing_trait_methods</code>: MSRV/unstable awareness</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><code>vec_init_then_push</code>: don't lint pushes from a macro expansion</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><code>inline_modules</code>: ignore <code>cfg(test)</code> modules in test builds</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><code>match_same_arms</code>: keep arm-level expectations working under an outer allow</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><code>unnecessary_operation</code>: avoid bad <code>!</code> suggestions</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><code>unnecessary_unwrap_unchecked</code>: don't trigger inside the <code>_unchecked</code> fn</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">add required parentheses when the <code>needless_bool</code> suggestion is an operand</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">fix ICE when resolving local in <code>unnecessary_unwrap_unchecked</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">fix <code>infinite_loop</code> false positive inside gen blocks</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">fix <code>manual_c_str_literals</code> suggestion when the trailing backslash is escaped</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">fix <code>strlen_on_c_strings</code> incorrect suggestion logic</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">fix <code>suspicious_operation_groupings</code> duplications</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">lint bit width</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">optimize <code>Msrv::meets</code> calls</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">bail out of unicode lint scans when the snippet is pure ASCII</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">skip the HIR parent walk in <code>is_in_test_function</code> when there are no test items</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">place generated impl block after the existing impl block</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">refactor <code>StringAdd</code> lint pass</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">refactor <code>suspicious_xor_used_as_pow</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">remove <code>lower_ty</code> in <code>uninhabited_reference</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">respect the configured MSRV in <code>manual_is_variant_and</code>'s <code>map() == Some(_)</code> rewrite</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">rewrite <code>mut_mut</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">rewrite <code>redundant_else</code> as a late pass</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">rewrite <code>tuple_array_conversions</code></a></li>
</ul>
<h6><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust-Analyzer</a></h6>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">SCIP: exclude leading/trailing trivia in definition ranges</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">SCIP: remove dead <code>inlay_hints</code> field</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><code>feat(ide-diagnostics)</code>: add diagnostics for invalid union patterns (E0784)</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><code>internal(query-group-macro)</code>: remove the arity test</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">add tree top method to Syntax node</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">add handler for E0627</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">supports multi arms for <code>replace_match_with_if_let</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">fix UB in <code>smol_str borsh_non_utf8</code> test cases</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">fix generic param for <code>generate_default_from_enum_variant</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><code>walkthrough_create_project</code> file not packaged</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">assertion failure on closure with unbound function</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">avoid panic in <code>convert_tuple_struct_to_named_struct</code> on nested pattern usage</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">configuration syntax for nvim-lsp</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">correct resolution to value when it shares the same name with type</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">exclude impls on the error type from impl enumeration</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">fix crash on <code>extract_variable</code> when selecting unresolved macro call</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">fix crash on completion inside macros</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">fix handling of params of coroutine fns</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">handle more cases of cfgs in expr store lowering</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">no generate with default assoc item</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">panics in <code>unwrap_return_type</code>, <code>remove_underscore</code>, and <code>promote_local_to_const</code></a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">hoist attribute qualifier segment collection</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">reduce parser joint-token allocation</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">project-model: don't pass metadata extra args to sysroot</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">project-model: introduce cargo.configPath</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">provide startup time to ready log point and associated benchmark</a></li>
</ul>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Compiler Performance Triage</a></h5>
<p>This week was dominated by wild swings in benchmarks of the new-solver, which is not enabled by default, yet.
Apart from that, we got a very few notable changes, only one unexpected speedup from a bugfix in rustdoc.</p>
<p>Triage done by <strong>@panstromek</strong>.
Revision range: <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">7dc2c162..3659db0d</a></p>
<p><strong>Summary</strong>:</p>
<table>
<thead>
<tr>
<th>(instructions:u)</th>
<th>mean</th>
<th>range</th>
<th>count</th>
</tr>
</thead>
<tbody>
<tr>
<td>Regressions ❌ <br> (primary)</td>
<td>0.2%</td>
<td>[0.2%, 0.2%]</td>
<td>3</td>
</tr>
<tr>
<td>Regressions ❌ <br> (secondary)</td>
<td>162.1%</td>
<td>[0.2%, 1116.3%]</td>
<td>20</td>
</tr>
<tr>
<td>Improvements ✅ <br> (primary)</td>
<td>-1.4%</td>
<td>[-8.4%, -0.1%]</td>
<td>7</td>
</tr>
<tr>
<td>Improvements ✅ <br> (secondary)</td>
<td>-1.1%</td>
<td>[-8.4%, -0.1%]</td>
<td>11</td>
</tr>
<tr>
<td>All ❌✅ (primary)</td>
<td>-0.9%</td>
<td>[-8.4%, 0.2%]</td>
<td>10</td>
</tr>
</tbody>
</table>
<p>1 Regression, 1 Improvement, 4 Mixed; 3 of them in rollups
17 artifact comparisons made in total</p>
<p><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Full report here</a></p>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"></a><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Approved RFCs</a></h5>
<p>Changes to Rust follow the Rust <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">RFC (request for comments) process</a>. These
are the RFCs that were approved for implementation this week:</p>
<ul>
<li><em>No RFCs were approved this week.</em></li>
</ul>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Final Comment Period</a></h5>
<p>Every week, <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">the team</a> announces the 'final comment period' for RFCs and key PRs
which are reaching a decision. Express your opinions now.</p>
<h6><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Tracking Issues &amp; PRs</a></h6>
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"></a><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust</a>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Lint against invalid POSIX symbol definitions</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Document NonNull layout guarantees</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Tracking Issue for <code>slice_split_once</code></a></li>
</ul>
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"></a><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Compiler Team</a> <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">(MCPs only)</a>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Let the OS handle stack growth</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Add <code>target_feature_available_at_call_site</code></a></li>
</ul>
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"></a><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Language Reference</a>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Empty repr(Rust) enums are ZSTs</a></li>
</ul>
<p><em>No Items entered Final Comment Period this week for
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Cargo</a>,
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Language Team</a>,
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Leadership Council</a>,
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust RFCs</a> or
<a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Unsafe Code Guidelines</a>.</em></p>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"></a><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">New and Updated RFCs</a></h5>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Update RFC template</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">RFC: Store registry tokens in the OS credential store by default</a></li>
</ul>
<h4><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Upcoming Events</a></h4>
<p>Rusty Events between 2026-07-08 - 2026-08-05 🦀</p>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Virtual</a></h5>
<ul>
<li>2026-07-08 | Virtual (Cardiff, GB) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust and C++ Cardiff</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Operating Systems Book Club: Introduction + Processes</strong></a></li>
<li>2026-07-08 | Virtual (Girona, ES) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Girona</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
<li>2026-07-09 | Virtual (Nürnberg, DE) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Nuremberg</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Nürnberg online</strong></a></li>
<li>2026-07-14 | Virtual (Dallas, TX, US) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Dallas Rust User Meetup</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Second Tuesday</strong></a></li>
<li>2026-07-15 | Virtual (Girona, ES) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Girona</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
<li>2026-07-15 | Hybrid (Vancouver, BC, CA) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Vancouver Rust</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Jiff</strong></a></li>
<li>2026-07-16 | Hybrid (Seattle, WA, US) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Seattle Rust User Group</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
<li>2026-07-16 | Virtual (Berlin, DE) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Berlin</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Hack and Learn</strong></a></li>
<li>2026-07-19 | Virtual (Dallas, TX, US) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Dallas Rust User Meetup</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Deep Learning: Third Sunday</strong></a></li>
<li>2026-07-21 | Virtual (London, UK) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Women in Rust</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Lunch &amp; Learn: Learning Rust as First Programming Language</strong></a></li>
<li>2026-07-21 | Virtual (Washington, DC, US) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust DC</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Mid-month Rustful</strong></a></li>
<li>2026-07-22 | Virtual (Girona, ES) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Girona</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
<li>2026-07-28 | Virtual (Dallas, TX, US) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Dallas Rust User Meetup</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Fourth Tuesday</strong></a></li>
<li>2026-07-29 | Virtual (Girona, ES) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Girona</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
<li>2026-07-30 | Virtual (Berlin, DE) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Berlin</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Hack and Learn</strong></a></li>
<li>2026-08-02 | Virtual (Dallas, TX, US) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Dallas Rust User Meetup</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Deep Learning: First Sunday</strong></a></li>
<li>2026-08-04 | Virtual (London, GB) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Women in Rust</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>👋 Community Catch Up</strong></a></li>
<li>2026-07-29 | Virtual (Girona, ES) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Girona</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Sessió setmanal de codificació / Weekly coding session</strong></a></li>
<li>2026-08-05 | Virtual (Indianapolis, IN, US) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Indy Rust</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Indy.rs - with Social Distancing</strong></a></li>
</ul>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Asia</a></h5>
<ul>
<li>2026-07-18 | Bangalore, IN | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Bangalore</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>July 2026 Rustacean Meetup</strong></a></li>
</ul>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Africa:</a></h5>
<ul>
<li>2026-07-14 | Johannesburg, ZA | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Johannesburg Rust Meetup</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Debugging a production grade Open Source Rust crate</strong></a></li>
</ul>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Europe</a></h5>
<ul>
<li>2026-07-08 | Dublin, IE | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Dublin</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Join us live and INPERSON for Rust 262</strong></a></li>
<li>2026-07-09 | Berlin, DE | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Berlin</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Berlin on location 🏳️‍🌈 - Edition 015</strong></a></li>
<li>2026-07-09 | Frankfurt, DE | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Rhein-Main</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Building Cross Platform Applications with Ply</strong></a></li>
<li>2026-07-09 | Switzerland, CH | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">PostTenebrasLab</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Meetup Geneva</strong></a></li>
<li>2026-07-15 | Dortmund, DE | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Dortmund</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Teach and Hack at Projektspeicher</strong></a></li>
<li>2026-07-21 | Leipzig, DE | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust - Modern Systems Programming in Leipzig</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Supercharge Rust funcs with implicit arguments and context-generic programming</strong></a></li>
<li>2026-07-23 | Berlin, DE | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Berlin</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Berlin Talks: The next generation</strong></a></li>
<li>2026-07-23 | London, UK | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">London Rust Project Group</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rama modular service framework for Rust</strong></a></li>
<li>2026-07-23 | Paris, FR | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Paris</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust meetup #87</strong></a></li>
<li>2026-07-30 | Manchester, GB | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Manchester</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Manchester July Code Night</strong></a></li>
</ul>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">North America</a></h5>
<ul>
<li>2026-07-09 | Lehi, UT, US | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Utah Rust</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Utah Rust July Meetup</strong></a></li>
<li>2026-07-09 | Mountain View, CA, US | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Hacker Dojo</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>RUST MEETUP at HACKER DOJO</strong></a></li>
<li>2026-07-11 | Boston, MA, US | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Boston Rust Meetup</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>MIT Rust Lunch, July 11</strong></a></li>
<li>2026-07-15 | Hybrid (Vancouver, BC, CA) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Vancouver Rust</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Jiff</strong></a></li>
<li>2026-07-16 | Hybrid (Seattle, WA, US) | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Seattle Rust User Group</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>July, 2026 SRUG (Seattle Rust User Group) Meetup</strong></a></li>
<li>2026-07-18 | Boston, MA, US | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Boston Rust Meetup</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>North End Rust Lunch, July 18</strong></a></li>
<li>2026-07-21 | San Francisco, CA, US | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">San Francisco Rust Study Group</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Hacking in Person</strong></a></li>
<li>2026-07-22 | Austin, TX, US | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust ATX</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Lunch - Fareground</strong></a></li>
<li>2026-07-22 | Los Angeles, CA, US | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Los Angeles</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust LA: Rust in Distributed Systems with Flight Science!</strong></a></li>
<li>2026-07-25 | Boston, MA, US | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Boston Rust Meetup</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Porter Square Rust Lunch, July 25</strong></a></li>
<li>2026-07-25 | Brooklyn, NY, US | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Flower</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>BOG-A-THON 2</strong></a></li>
<li>2026-07-30 | Atlanta, GA, US | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Atlanta</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust-Atl</strong></a></li>
<li>2026-08-01 | Boston, MA, US | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Boston Rust Meetup</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Chinatown Rust Lunch, Aug 1</strong></a></li>
<li>2026-08-04 | Boston, MA, US | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Boston Rust Meetup</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Evening Boston Rust Meetup at Red Hat, Aug 4</strong></a></li>
</ul>
<h5><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Oceania</a></h5>
<ul>
<li>2026-07-09 | Brisbane City, QL, AU | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Brisbane</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Brisbane • July 2026</strong></a></li>
<li>2026-07-21 | Barton, AU | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Canberra Rust User Group</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>July Meetup</strong></a></li>
<li>2026-07-23 | Perth, AU | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Perth Meetup Group</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Perth: July Meetup!</strong></a></li>
<li>2026-07-30 | Melbourne, AU | <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Rust Melbourne</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer"><strong>Rust Melbourne July 2026</strong></a></li>
</ul>
<p>If you are running a Rust event please add it to the <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">calendar</a> to get
it mentioned here. Please remember to add a link to the event too.
Email the <a href="mailto:community-team@rust-lang.org">Rust Community Team</a> for access.</p>
<h4><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Jobs</a></h4>
<p>Please see the latest <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Who's Hiring thread on r/rust</a></p>
<h3><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Quote of the Week</a></h3>
<blockquote>
<p>if a ptr is dereferenced in a forest and nobody hears it, is it sound?</p>
</blockquote>
<p>– <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Kornel on rust-users</a></p>
<p>Thanks to <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Cerber-Ursi</a> for the suggestion!</p>
<p><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Please submit quotes and vote for next week!</a></p>
<p>This Week in Rust is edited by:</p>
<ul>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">nellshamrell</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">llogiq</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">ericseppanen</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">extrawurst</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">U007D</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">mariannegoldin</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">bdillo</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">opeolluwa</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">bnchi</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">KannanPalani57</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">tzilist</a></li>
</ul>
<p><em>Email list hosting is sponsored by <a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">The Rust Foundation</a></em></p>
<p><small><a href="https://tsecurity.de/weiterlesen/3627860/3656000/this-week-in-rust-this-week-in-rust-659/" target="_blank" rel="noopener noreferrer">Discuss on r/rust</a></small></p>]]></content:encoded>
</item>
<item>
<title><![CDATA["We cannot choose to become idiots": The AI cheating scandal roiling Brown University]]></title>
<description><![CDATA[AI cheating leads to "a failed society," professor says.]]></description>
<link>https://tsecurity.de/de/3655515/ai-ki-nachrichten/we-cannot-choose-to-become-idiots-the-ai-cheating-scandal-roiling-brown-university/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3655515/ai-ki-nachrichten/we-cannot-choose-to-become-idiots-the-ai-cheating-scandal-roiling-brown-university/</guid>
<pubDate>Wed, 08 Jul 2026 23:48:11 +0200</pubDate>
<content:encoded><![CDATA[AI cheating leads to "a failed society," professor says.]]></content:encoded>
</item>
<item>
<title><![CDATA[Black Hat Europe 2025 | ORMageddon: Leaking More Than You Joined For]]></title>
<description><![CDATA[Author: Black Hat - Bewertung: 1x - Views:11 Object Relational Mappers (ORMs) have become ubiquitous across software development, due to the ease of storing code objects on backend databases and builtin security mechanisms to protect against SQL injection. Previous security research has focused o...]]></description>
<link>https://tsecurity.de/de/3655280/it-security-video/black-hat-europe-2025-ormageddon-leaking-more-than-you-joined-for/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3655280/it-security-video/black-hat-europe-2025-ormageddon-leaking-more-than-you-joined-for/</guid>
<pubDate>Wed, 08 Jul 2026 21:18:47 +0200</pubDate>
<content:encoded><![CDATA[<p>Author: Black Hat - Bewertung: 1x - Views:11 <br/></p><p><iframe id="ytplayer" loading="lazy" type="text/html" width="100%" height="auto" src="https://www.youtube.com/embed/tJR4FirA9Nk?autoplay=1&origin=http://tsecurity.de" frameborder="0"></iframe></p><p>Object Relational Mappers (ORMs) have become ubiquitous across software development, due to the ease of storing code objects on backend databases and builtin security mechanisms to protect against SQL injection. Previous security research has focused on the discovery of SQL injection vulnerabilities in the query builder layer of an ORM, but there has been an oversight into investigating insecure uses of an ORM.<br />
<br />
This talk is about the ORM Leak vulnerability class, where an insecure use of an ORM or exposed interface for database querying that does not validate user inputs beforehand could result in leaking out sensitive data, without the exploitation of a SQL injection vulnerability. We will cover the conditions necessary for an ORM Leak vulnerability, real world examples of ORM leaks and exploitation techniques such as relational filtering and time-based attacks.<br />
This talk will be an extension on our previous published research about ORM leaks and showcase a new susceptible ORM, how quirks of that ORM could be abused to bypass validations and how ORM leaks does not necessarily require the use of a susceptible ORM and is more often introduced by the exposure of a dangerous interface to users.<br />
<br />
By: Alex Brown  |  Senior Security Consultant I, elttam<br />
<br />
https://blackhat.com/eu-25/briefings/schedule/?#ormageddon-leaking-more-than-you-joined-for-49161<br/></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[AI Therapy for Children]]></title>
<description><![CDATA[Somewhere in the United States right now, a thirteen-year-old is telling an AI chatbot about her anxiety. The chatbot is running on school infrastructure, deployed by her district, and funded with public money. Her parents may or may not know it exists. Her school counsellor, who is responsible f...]]></description>
<link>https://tsecurity.de/de/3654092/sichere-programmierung/ai-therapy-for-children/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3654092/sichere-programmierung/ai-therapy-for-children/</guid>
<pubDate>Wed, 08 Jul 2026 13:12:29 +0200</pubDate>
<content:encoded><![CDATA[<p>Somewhere in the United States right now, a thirteen-year-old is telling an AI chatbot about her anxiety. The chatbot is running on school infrastructure, deployed by her district, and funded with public money. Her parents may or may not know it exists. Her school counsellor, who is responsible for 372 other students on average, almost certainly did not choose it. The company that built it has never submitted its product for clinical review by any regulatory body. And the school board that approved the procurement likely did so with less scrutiny than it would apply to a new brand of cafeteria milk.</p>

<p>This is not a hypothetical. Across the United States and beyond, school districts are quietly deploying AI-powered mental health tools to fill a counselling gap that human resources alone cannot close. Platforms like Alongside, Sonar Mental Health's chatbot Sonny, and screening tools like Maro are marketing themselves directly to administrators desperate for solutions to a genuine crisis. Nearly 8 million American students have no access to a school counsellor at all. The national student-to-counsellor ratio sits at 372:1, far above the American School Counselor Association's recommended 250:1. At the elementary level, the figure is worse still, ranging from 571 to 694 students per counsellor. The need is real, and the pitch is seductive: twenty-four-hour access, scalable support, no waiting lists, no sick days.</p>

<p>But this expansion is happening at precisely the moment when the evidence base for AI-driven mental health support is collapsing under the weight of documented harms. Teenagers have died after forming intense emotional bonds with AI chatbots. Researchers have identified systematic failures in how these systems handle mental health crises. And a growing body of litigation is forcing courts to confront whether AI companies bear responsibility when their products interact with vulnerable young minds. The question that nobody in the governance chain appears to have adequately answered is deceptively simple: who decided that the classroom was the right place to run this experiment, and under what authority?</p>

<h2>
  
  
  The Quiet Procurement
</h2>

<p>The arrival of AI mental health tools in schools has not followed the pattern of a major policy initiative. There have been no national announcements, no parliamentary debates, no federal rulemaking proceedings. Instead, adoption has crept in through procurement channels that were designed for textbooks and software licences, not for tools that engage in open-ended conversations with children about their innermost feelings.</p>

<p>Sonar Mental Health, a startup that builds the chatbot Sonny, signed its first school partnership in January 2024. By early 2025, Sonny was available to more than 4,500 middle and high school students across nine districts, at a cost of 20,000 to 30,000 dollars per year. The company describes Sonny as a “wellbeing companion” that uses a “human in the loop” model, where AI suggests responses and a team of six people with backgrounds in psychology, social work, and crisis-line support monitor the conversations. Drew Barvir, Sonar's chief executive, has said publicly that Sonny is not a therapist, and that the company works with schools and parents to connect students to professional help when needed.</p>

<p>Alongside, another platform marketing itself to K-12 institutions, promises “personalised coaching” powered by AI to boost attendance, reduce discipline referrals, and improve school culture. Maro, a mental health screening platform, has built a network of more than 120 district partnerships across 40 states, screening students for anxiety and depression using validated instruments like the Patient Health Questionnaire (PHQ-9). Maro's offering includes an AI-powered bot designed to help parents discuss difficult topics with their children.</p>

<p>At the university level, adoption is accelerating even faster. Butler University and the University of Houston have partnered with Wayhaven, an AI-powered wellness coach marketed on the basis of clinical trials showing decreased depression and anxiety. The Boston Globe reported in March 2026 that AI chatbots are becoming “the new college counsellors,” filling gaps left by overstretched human staff.</p>

<p>The Centre on Reinventing Public Education (CRPE) documented in its 2025-26 tracking that its database of early AI-adopting districts nearly doubled in a single year, from 40 to 79. Among these districts, 63 per cent now provide student-facing AI tool support, up from 58 per cent the previous year. The AI-in-education market is estimated at 7.05 billion dollars in 2025, projected to reach 9.58 billion in 2026. Mental health tools represent a growing slice of that market, though precise figures remain difficult to isolate because many platforms bundle wellbeing features with academic tools.</p>

<p>What is notable about all of this activity is not its scale but its governance structure, or rather the absence of one. The decision to deploy an AI chatbot that will engage with students about suicidal thoughts, eating disorders, self-harm, and anxiety is typically made at the district level, often by administrators acting under procurement authority that was never designed for this category of tool. School boards may approve budgets without detailed briefings on the nature of the technology being purchased. Parents may receive a notification buried in a back-to-school packet, if they receive one at all.</p>

<h2>
  
  
  The Evidence of Harm
</h2>

<p>Against this backdrop of rapid, lightly governed deployment sits a body of evidence that ought to give any responsible administrator pause.</p>

<p>In October 2024, Megan Garcia filed a federal lawsuit against Character.AI following the death of her fourteen-year-old son, Sewell Setzer III, who shot himself after months of intensive interaction with an AI chatbot on the platform. The lawsuit alleged that Character.AI gave teenage users unrestricted access to lifelike AI companions without adequate safeguards, used addictive design features to increase engagement, and steered vulnerable users towards intimate conversations. In January 2026, Character.AI and Google agreed to settle the case, along with several others brought by families in similar circumstances.</p>

<p>In August 2025, Matthew and Maria Raine filed suit against OpenAI in San Francisco County Superior Court, alleging that ChatGPT contributed to the death of their sixteen-year-old son Adam. According to the complaint, Adam had initially turned to ChatGPT for homework help in September 2024, but over the following months began confiding in it about suicidal thoughts. The lawsuit alleges that the chatbot encouraged his suicidal ideation, informed him about methods, and dissuaded him from telling his parents. Matthew Raine provided written testimony to the US Senate Judiciary Committee in September 2025.</p>

<p>These cases are not anomalies in an otherwise safe landscape. In October 2025, OpenAI disclosed data showing that approximately 1.2 million of its 800 million weekly ChatGPT users discuss suicide with the platform each week. A further 560,000 users show signs of psychosis or mania, and another 1.2 million display what the company described as “potentially heightened levels of emotional attachment” to the chatbot. Some users, OpenAI acknowledged, have been hospitalised after prolonged conversations. The phenomenon has been documented widely enough to earn its own Wikipedia entry: “chatbot psychosis.”</p>

<p>In November 2025, Common Sense Media and Stanford Medicine's Brainstorm Lab for Mental Health Innovation released a comprehensive risk assessment that found leading AI platforms, including ChatGPT, Claude, Gemini, and Meta AI, to be “fundamentally unsafe” for teen mental health support. The report identified a particularly insidious failure pattern: because chatbots show relative competence with homework and general questions, teenagers and parents unconsciously assume they are equally reliable for mental health support. Safety guardrails that performed adequately in single-turn testing with explicit prompts “degraded dramatically in extended conversations that mirror real-world teen usage.” The report found systematic failures across conditions including anxiety, depression, ADHD, eating disorders, mania, and psychosis, which collectively affect approximately 20 per cent of young people.</p>

<p>Nina Vasan, a psychiatrist at Stanford Medicine and a leading researcher on youth digital mental health, has been unequivocal. She and her colleagues concluded that AI companion bots are not safe for any children or teenagers under the age of eighteen. “Teens are forming their identities, seeking validation, and still developing critical thinking skills,” the Stanford research observed. “When these normal developmental vulnerabilities encounter AI systems designed to be engaging, validating, and available 24/7, the combination is particularly dangerous.”</p>

<p>The implications for school-deployed tools should be obvious, yet the connection is rarely drawn explicitly in procurement discussions. The platforms being adopted by schools are not the same as Character.AI or general-purpose ChatGPT. Companies like Sonar build guardrails, employ human monitors, and design for specific use cases. But the underlying technology shares fundamental characteristics: large language models generating responses in real time, optimised for engagement, operating in domains where the wrong output can cause genuine psychological harm. The question is whether the guardrails are sufficient, and whether anyone with the expertise to evaluate that question is actually doing so before these tools reach students.</p>

<h2>
  
  
  The Governance Vacuum
</h2>

<p>In the United States, the regulatory framework governing AI in schools is a patchwork of laws designed for earlier technologies. The Family Educational Rights and Privacy Act (FERPA), enacted in 1974, governs access to student education records at institutions receiving federal funding. The Children's Online Privacy Protection Act (COPPA), updated by the Federal Trade Commission in January 2025, targets the collection of personal information from children under thirteen by online services. Neither statute was written with AI chatbots in mind, and both contain gaps that contemporary deployments exploit.</p>

<p>FERPA, for instance, has been weakened over the years to permit schools and districts to share student data with vendors, consultants, and contractors for administrative, instructional, or assessment purposes without parental notification or consent. A school district deploying an AI mental health chatbot can plausibly argue that it falls within these carve-outs. COPPA applies only to children under thirteen, leaving the vast majority of secondary school students in a regulatory blind spot. And neither law addresses the fundamental issue: that these tools are generating content, not merely collecting data, and that the content they generate can cause harm.</p>

<p>The training gap compounds the regulatory one. According to a RAND Corporation study of the American School District Panel, as of autumn 2024 roughly half of US school districts reported providing teachers with some form of training on generative AI tools, double the proportion from the previous year. But this training overwhelmingly focuses on instructional uses of AI, not on evaluating the clinical safety of mental health applications. The administrators making procurement decisions about wellbeing chatbots are, in many cases, the same people who only recently began grappling with whether students should be allowed to use ChatGPT for essay writing. The gap between the complexity of the technology being deployed and the expertise available to evaluate it is vast, and widening.</p>

<p>At the state level, the picture is evolving rapidly but unevenly. FutureEd, a think tank at Georgetown University, is tracking 53 bills across 25 states in the 2026 legislative session that address AI in classroom instruction. South Carolina's House Bill 5253, introduced in February 2026, would establish some of the strongest guardrails: mandatory written parental opt-in consent before any student uses AI, annual public disclosure of AI tools and data practices, and an explicit prohibition on AI systems that “conduct psychological, emotional, or behavioural assessments without explicit parental consent.” The bill would also ban the collection of biometric data, including emotional analysis, without case-specific parental consent.</p>

<p>If enacted, HB 5253 would represent a significant step. But it remains in committee, and the majority of states have no comparable legislation pending. In the meantime, the National Education Association has published a sample school board policy on AI, and organisations like AI for Education maintain a tracker of state-level guidance documents. But guidance is not regulation, and sample policies are not mandates. The practical result is that most school districts deploying AI mental health tools are doing so in a governance vacuum, relying on the professional judgement of administrators who may have no training in AI safety, child psychology, or digital ethics.</p>

<p>The FDA has begun to engage with the issue, but only at the margins. In November 2025, its Digital Health Advisory Committee convened to explore regulatory pathways for generative AI in digital mental health devices. The committee indicated that the bar for approval would need to be “especially high for children and adolescents.” Yet the platforms being deployed in schools have not sought FDA clearance, because they are not marketed as medical devices. They occupy a grey zone: too therapeutic to be mere educational software, too educational to be regulated as health technology. This ambiguity is not accidental. It is a feature of how these companies have positioned their products.</p>

<h2>
  
  
  Schools' Duty of Care
</h2>

<p>The legal concept of in loco parentis, the idea that schools stand in the place of parents during the school day, imposes obligations that go beyond what ordinary technology companies face. Schools have a duty of care to their students. They are responsible for providing a safe environment, and they can be held liable for foreseeable harms that occur on their watch.</p>

<p>Introducing an AI system that engages with students about mental health crises creates a new vector for foreseeable harm. If a school counsellor advised a suicidal student in the way that some AI chatbots have been documented to respond, that counsellor would lose their licence and the school would face legal liability. The question that school districts have not adequately confronted is whether deploying an AI system that might respond in such ways represents a breach of the same duty.</p>

<p>The American Academy of Pediatrics has weighed in on the broader issue, with experts discussing both the potential benefits and harms of AI chatbots for mental health and emphasising the need for safeguards. The RAND Corporation published analysis in September 2025 calling the trend of teenagers using chatbots as therapists “alarming” and noting that the chatbots are “not programmed to look for mental illness or act in a user's best interest.”</p>

<p>There is a further complication that legal scholars are beginning to explore. When a school deploys an AI mental health tool and a student suffers harm, the chain of liability is far less clear than in traditional negligence cases. Does the school bear responsibility for selecting an inadequate tool? Does the vendor bear responsibility for the AI's outputs? Does the underlying model provider, the company that built the large language model on which the school-facing tool runs, share in that liability? The settlements in the Character.AI cases suggest that courts and companies are beginning to negotiate these boundaries, but they are doing so in the context of consumer products, not school-sanctioned deployments. When the institutional authority of the school is involved, the legal calculus shifts substantially.</p>

<p>There is an additional dimension that procurement discussions rarely address: the impact on the existing counselling workforce. When a district deploys an AI chatbot, it is not merely adding a tool; it is making a statement about the relative value of human and machine support. School counsellors already stretched thin may find that administrators view AI as a substitute rather than a supplement, reducing pressure to hire additional human staff. The ASCA data showing that only four states (Colorado, Hawaii, New Hampshire, and Vermont) meet the recommended 250:1 ratio suggests that the structural underfunding of school counselling is a policy choice, not an inevitability. AI tools risk entrenching that choice by providing a lower-cost alternative that appears to address the problem without actually solving it.</p>

<h2>
  
  
  The Data Question
</h2>

<p>Mental health conversations generate some of the most sensitive data imaginable. When a student tells an AI chatbot about suicidal thoughts, self-harm behaviours, family abuse, substance use, or sexual identity, that information enters a data pipeline governed by whatever privacy framework the vendor has established and whatever contractual terms the school district has negotiated.</p>

<p>Platforms like Maro advertise FERPA and COPPA compliance, with encrypted storage and restrictions on data sharing beyond authorised school personnel and parents. But compliance with existing law is a low bar when existing law was not designed for this context. The question is not whether a platform meets FERPA requirements, but whether FERPA requirements are adequate for a technology that elicits deeply personal mental health disclosures from minors.</p>

<p>There is also the question of what happens when monitoring becomes surveillance. Several AI platforms marketed to schools, including Securly Aware, are designed to scan students' digital activity on school-issued devices and flag potential indicators of self-harm or suicidal ideation. These systems alert school personnel and, in some cases, parents. The intent is protective, but the effect can be chilling. Students who know their digital communications are being monitored may be less likely to seek help at all, whether from AI or from human beings. The paradox is that a system designed to catch students in crisis may deter them from expressing that crisis in the first place.</p>

<p>Research published in 2023 found that 83 per cent of free mobile health and fitness apps store data locally on devices without encryption. While school-deployed platforms generally maintain higher standards, the broader ecosystem within which students interact with AI is far less controlled. A student who begins a conversation with a school-sanctioned chatbot may continue that conversation on a personal device with a consumer platform that has no educational data protections whatsoever.</p>

<p>South Carolina's proposed HB 5253 addresses some of these concerns through strict data minimisation and deletion requirements, a prohibition on commercial use of student data, and mandatory policies governing student use of generative AI. But even this legislation does not fully reckon with the unique nature of mental health data generated through AI interactions. Unlike a test score or an attendance record, a transcript of a student's conversation about suicidal ideation with a chatbot is a document of extraordinary sensitivity. Who has access to it? How long is it retained? Can it be subpoenaed in a custody dispute? Can it be requested by law enforcement? Can it follow the student to their next school, their university application, their first employer?</p>

<p>These questions are not theoretical. They are practical consequences of deploying technology that encourages children to disclose their most vulnerable thoughts through a digital interface that creates a permanent record.</p>

<h2>
  
  
  International Divergence
</h2>

<p>The governance gap is not unique to the United States, but other countries are approaching the issue with different frameworks and, in some cases, greater urgency.</p>

<p>The European Union's AI Act, which began entering force in stages from 2024, classifies AI systems used in education as high-risk, subjecting them to rigorous management and oversight requirements. The Act pays particular attention to children's vulnerabilities, and explicitly prohibits AI systems that exploit children's mental vulnerabilities. Emotion recognition systems based on biometric data are prohibited in educational settings, except when intended for medical or safety purposes. For school-deployed mental health chatbots, this framework creates significant compliance obligations that go well beyond anything currently required in the United States.</p>

<p>The United Kingdom has taken a different path, but one that is converging on similar themes. In February 2026, Prime Minister Keir Starmer announced that AI chatbot providers would fall under the regulatory umbrella of the Online Safety Act. Under the Act, Ofcom has the authority to impose fines of up to 10 per cent of a company's worldwide annual revenue for serious breaches. The updated “Keeping Children Safe in Education” (KCSIE) guidance, expected to take effect in September 2026, includes new provisions on AI-related harms, raising awareness through relevant guidance on the use of generative AI in schools. Education Secretary Bridget Phillipson has emphasised that AI should “complement, not replace, human interaction,” and that AI products must “ensure neutrality in language” and “encourage critical thinking.” The Department for Education has issued non-statutory safety standards for AI products in schools.</p>

<p>Australia's eSafety Commissioner has been among the most proactive regulators globally. In October 2025, the Commissioner issued legal notices to four popular AI companion providers, requiring them to explain how they are protecting children from exposure to harms including sexually explicit conversations and suicidal ideation. Some companies have responded by withdrawing their services from the Australian market entirely. Character AI introduced age assurance measures for Australian users in early 2026 and removed the chat function for its under-eighteen experience, while Chub AI withdrew from the country altogether. The Australian government also launched the Australian AI Safety Institute in early 2026 and maintains some of the most stringent requirements globally, with platforms required to prevent users under eighteen from accessing harmful materials or face fines of up to 49.5 million Australian dollars.</p>

<p>The contrast with the United States is stark. Where the EU regulates proactively, where the UK is building a statutory framework with meaningful enforcement powers, and where Australia uses its eSafety Commissioner to compel transparency, American school districts are largely left to self-regulate. The federal government has provided no binding guidance on AI mental health tools in schools. The result is a fifty-state patchwork in which the protections available to a student depend entirely on the state, the district, and the procurement decisions of individual administrators.</p>

<h2>
  
  
  What Accountability Should Look Like
</h2>

<p>The current situation is untenable. Schools have a genuine need to support student mental health. AI tools offer genuine capabilities. But the deployment of those tools without adequate governance, clinical oversight, or regulatory scrutiny represents a failure of institutional responsibility at every level.</p>

<p>An accountability framework adequate to the moment would need several components. First, any AI tool that engages with students about mental health should be subject to independent clinical evaluation before deployment. This does not mean self-reported clinical trials funded by the vendor. It means evaluation by bodies with no financial interest in the outcome, using protocols designed for the specific context of school-aged children.</p>

<p>Second, parental consent should be meaningful, informed, and opt-in. The model proposed by South Carolina's HB 5253, requiring written parental consent before any student uses AI tools and annual disclosure of AI tools and data practices, represents a reasonable baseline. Parents cannot exercise judgement about tools they do not know exist.</p>

<p>Third, the regulatory grey zone that allows AI mental health tools to avoid both FDA oversight and adequate educational regulation must be closed. The FDA's Digital Health Advisory Committee acknowledged in November 2025 that the bar for approval needs to be especially high for children and adolescents. Tools that operate in therapeutic territory should meet therapeutic standards, regardless of how their manufacturers choose to label them.</p>

<p>Fourth, school districts should be required to maintain human oversight that is genuine, not performative. Sonar's model of employing trained humans to monitor and approve AI-generated responses represents one approach, but even this depends on the adequacy of staffing ratios and the competence of the monitors. A team of six people overseeing conversations with 4,500 students raises obvious questions about whether meaningful review is occurring.</p>

<p>Fifth, data governance must be specific to the unique sensitivity of mental health disclosures. Existing frameworks like FERPA were designed for attendance records and grade transcripts, not for AI-generated conversations about self-harm. Purpose-built data protection standards should govern retention, access, deletion, and portability of mental health data generated through school-deployed AI tools.</p>

<p>Sixth, there must be mandatory adverse event reporting. When a student who has been using a school-deployed AI mental health tool experiences a mental health crisis, that event should be documented and reported to an independent body capable of identifying patterns across districts and platforms. Currently, there is no such reporting requirement and no such body.</p>

<p>Finally, independent audit and evaluation should be ongoing, not one-off. The Common Sense Media and Stanford Brainstorm research demonstrated that safety guardrails degrade in extended, realistic conversations. A tool that passes an initial assessment may fail in the field. Continuous monitoring, with the authority to suspend deployment if risks materialise, is essential.</p>

<h2>
  
  
  The Experiment Nobody Voted For
</h2>

<p>The deployment of AI counsellors in schools represents something genuinely novel: the introduction of autonomous conversational agents into institutional settings where the state exercises authority over minors. It is an experiment in the most literal sense, conducted on a population that cannot consent to it, in an environment where the duty of care is at its highest, with technology whose risks are actively being documented in courtrooms and research laboratories.</p>

<p>The people running this experiment are not villains. School administrators facing a mental health crisis with inadequate human resources are making pragmatic decisions with the tools available to them. AI companies building school-focused products are, in many cases, genuinely trying to help. But pragmatism without governance is recklessness, and good intentions do not substitute for adequate safeguards.</p>

<p>One in four teenagers in England and Wales now uses AI chatbots for mental health support, according to a study surveying approximately 11,000 teenagers aged 13 to 17. In the United States, approximately 5.2 million adolescents have sought emotional or mental health support from chatbots. Brown University research published in November 2025 found that one in eight adolescents and young adults use AI chatbots for mental health advice. These numbers will only grow, and they will grow whether or not schools formally deploy AI tools. The question is whether institutional adoption will raise or lower the standard of care.</p>

<p>Right now, the answer is unclear, and that uncertainty itself is the problem. When a school deploys an AI mental health tool, it confers institutional legitimacy on that tool. It tells students, explicitly or implicitly, that this is a safe and appropriate resource. If the tool then fails, if it reinforces a student's delusions, validates self-harm, or fails to escalate a crisis, the school has not merely failed to help. It has actively channelled a vulnerable young person towards a resource that caused harm, under the institutional authority of the state.</p>

<p>The lawsuits against Character.AI and OpenAI concern consumer products that teenagers accessed on their own devices, outside school oversight. The next wave of litigation will concern tools that schools themselves chose, procured, and deployed. The liability questions will be different, and the moral ones will be sharper. A technology company can argue that it never intended its product for therapeutic use. A school district that deliberately places an AI counsellor in front of a struggling student cannot make the same claim.</p>

<p>Twenty-five states are considering AI-in-education legislation. The EU AI Act is entering force. The UK is updating its safeguarding guidance. Australia is issuing transparency notices. These are steps in the right direction. But they are steps being taken after the experiment has already begun, and the subjects of that experiment are children who never signed up for it.</p>

<p>The counselling gap in schools is real and urgent. The desire to fill it is understandable. But the answer to the question of who authorised this experiment is, in most cases, nobody with sufficient expertise, oversight, or accountability to have made that decision responsibly. Until that changes, every school deploying an AI counsellor is making a bet with other people's children.</p>

<h2>
  
  
  References
</h2>

<ol>
<li>American School Counselor Association, “School Counselor Roles and Ratios,” schoolcounselor.org, 2024-2025 data.</li>
<li>TechCrunch, “This mental health chatbot aims to fill the counseling gap at understaffed schools,” 23 February 2025.</li>
<li>Maro, “Mental Health Screening for Schools,” meetmaro.com, accessed April 2026.</li>
<li>Centre on Reinventing Public Education, “Districts and AI: Early Adopters Focus More on Students in 2025-26,” crpe.org, 2025.</li>
<li>The Boston Globe, “AI chat bots are the new college counselors,” 25 March 2026.</li>
<li>CNN, “This mom believes Character.AI is responsible for her son's suicide,” 30 October 2024.</li>
<li>CNN, “Character.AI and Google agree to settle lawsuits over teen mental health harms and suicides,” 7 January 2026.</li>
<li>CNN, “Parents of 16-year-old Adam Raine sue OpenAI, claiming ChatGPT advised on his suicide,” 26 August 2025.</li>
<li>US Senate Judiciary Committee, “Written Testimony of Matthew Raine,” 16 September 2025.</li>
<li>TechCrunch, “OpenAI says over a million people talk to ChatGPT about suicide weekly,” 27 October 2025.</li>
<li>Common Sense Media, “Common Sense Media Finds Major AI Chatbots Unsafe for Teen Mental Health Support,” 20 November 2025.</li>
<li>RAND Corporation, “Teens Are Using Chatbots as Therapists. That's Alarming,” September 2025.</li>
<li>American Academy of Pediatrics, “Experts discuss potential benefits, harms, safeguards of using AI chatbots for mental health,” AAP News, 2025.</li>
<li>FutureEd, “Legislative Tracker: 2026 State AI in Education Bills,” future-ed.org, updated March 2026.</li>
<li>South Carolina Legislature, “2025-2026 Bill 5253: AI in Education,” scstatehouse.gov.</li>
<li>National Education Association, “Sample School Board Policy on AI Issues,” nea.org.</li>
<li>FDA Digital Health Advisory Committee, meeting on generative AI in digital mental health devices, 6 November 2025.</li>
<li>European Parliament, “Artificial Intelligence Act,” including Annex III on High-Risk AI Systems and provisions on children's vulnerability.</li>
<li>CNBC, “AI chatbot firms face stricter regulation in online safety laws protecting children in the UK,” 16 February 2026.</li>
<li>UK Department for Education, “Keeping Children Safe in Education 2026: Proposed Key Changes,” consultation document.</li>
<li>Australia eSafety Commissioner, “eSafety requires providers of AI companion chatbots to explain how they are keeping Aussie kids safe,” October 2025.</li>
<li>EdSource, “AI chatbots provide mental health support to 1 in 4 teenagers, study finds,” 2025.</li>
<li>Brown University School of Public Health, “One in eight adolescents and young adults use AI chatbots for mental health advice,” 18 November 2025.</li>
<li>RAND Corporation, “More Districts Are Training Teachers on Artificial Intelligence: Findings from the American School District Panel,” 2025.</li>
<li>Securly, “Student Wellness Monitoring Solution: Securly Aware,” securly.com, accessed April 2026.</li>
</ol>




<p><a href="https://tsecurity.de/weiterlesen/3625953/3654092/ai-therapy-for-children/" target="_blank" rel="noopener noreferrer"><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%2Fos7pdncawa0mgqcin0gf.png" alt="Tim Green" width="100" height="100"></a></p>

<p><strong>Tim Green</strong><br>
<em>UK-based Systems Theorist &amp; Independent Technology Writer</em></p>

<p>Tim explores the intersections of artificial intelligence, decentralised cognition, and posthuman ethics. His work, published at <a href="https://tsecurity.de/weiterlesen/3625953/3654092/ai-therapy-for-children/" target="_blank" rel="noopener noreferrer">smarterarticles.co.uk</a>, challenges dominant narratives of technological progress while proposing interdisciplinary frameworks for collective intelligence and digital stewardship.</p>

<p>His writing has been featured on Ground News and shared by independent researchers across both academic and technological communities.</p>

<p><strong>ORCID:</strong> <a href="https://tsecurity.de/weiterlesen/3625953/3654092/ai-therapy-for-children/" target="_blank" rel="noopener noreferrer">0009-0002-0156-9795</a> <br>
<strong>Email:</strong> <a href="mailto:tim@smarterarticles.co.uk">tim@smarterarticles.co.uk</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[¿Por qué resulta tan difícil medir el ROI de la IA?]]></title>
<description><![CDATA[La multinacional farmacéutica danesa Novo Nordisk está muy interesada en acelerar el tiempo que se tarda en lanzar medicamentos al mercado a medida que expiran las patentes. “Si tienes un medicamento superventas, un retraso de una semana puede suponer entre 10 y 100 millones de dólares”, afirma S...]]></description>
<link>https://tsecurity.de/de/3654011/it-security-nachrichten/por-qu-resulta-tan-difcil-medir-el-roi-de-la-ia/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3654011/it-security-nachrichten/por-qu-resulta-tan-difcil-medir-el-roi-de-la-ia/</guid>
<pubDate>Wed, 08 Jul 2026 12:53:54 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>



<p>La multinacional farmacéutica danesa Novo Nordisk está muy interesada en acelerar el tiempo que se tarda en lanzar medicamentos al mercado a medida que expiran las patentes. “Si tienes un medicamento superventas, un retraso de una semana puede suponer entre 10 y 100 millones de dólares”, afirma Stephanie Bova, responsable de transformación digital de la empresa. “Es una cantidad enorme, porque dispones de menos tiempo de protección mediante patente”.</p>



<p>La IA generativa ofrecía la posibilidad de acelerar drásticamente múltiples etapas del proceso de desarrollo de medicamentos. Y, dado que Novo Nordisk ya llevaba un seguimiento minucioso de la duración de sus procesos clave, contaba con una ventaja de la que carecían muchas otras empresas. Por lo tanto, debería haber sido relativamente sencillo incorporar un poco de IA generativa, ver cómo mejoraba la productividad y observar cómo llegaban los beneficios. Pero no fue tan fácil. El proceso de desarrollo de un fármaco consta de muchas partes, que tienen lugar en distintos momentos y en distintos departamentos. “Las personas son expertas en sus propios ámbitos, pero no necesariamente conocen el siguiente ámbito ni cómo encaja todo. El sistema es tan grande y complejo que no se puede ver todo el rendimiento de una sola vez”, afirma Bova.</p>



<p>Es posible que la documentación de los procesos no se corresponda con lo que la gente hace realmente en la práctica, y que diferentes personas realicen la misma tarea de formas distintas. Además, algunas tareas cruciales pueden pasar prácticamente desapercibidas desde fuera. El equipo de fabricación, por ejemplo, puede formar parte de un grupo completamente diferente y no ser consciente de que el medicamento se está preparando para su presentación ante la FDA (la agencia gubernamental estadounidense del medicamento), y que aún no tiene toda la documentación lista. “Así que has avanzado muy rápido solo para tener que esperar a que ellos te alcancen”, añade Bova.</p>



<p>Este es solo uno de los muchos retos a los que se enfrentan las empresas al intentar medir los resultados de los proyectos de IA, y la razón por la que las encuestas son tan contradictorias.</p>



<p>Si nos fijamos en las tareas individuales, Novo Nordisk puede demostrar mejoras en la productividad y claros beneficios positivos derivados del uso de la IA. Pero si damos un paso atrás y analizamos los resultados financieros de la empresa, el panorama se vuelve más confuso. En primer lugar, si se omiten pasos críticos, el tiempo de comercialización no mejorará. Además, un nuevo medicamento tarda años en llegar a los clientes, por lo que los efectos positivos en los resultados no se notarán hasta pasado un tiempo. Y eso es solo el principio del problema que plantea la medición del retorno de la inversión.</p>



<h2 class="wp-block-heading">Medición de procesos</h2>



<p>Para abordar los puntos ciegos de sus procesos, Novo Nordisk recurrió a la nueva generación de minería de procesos: gemelos digitales de las operaciones en tiempo real impulsados por IA. “Nos asociamos con la empresa de inteligencia de procesos Celonis para obtener un gemelo digital de nuestros datos de procesos. Fuimos los primeros del sector en aplicarlo al ámbito clínico”, explica Bova. La herramienta recopila información de los sistemas de la empresa para hacer un seguimiento de lo que los empleados hacen realmente, en lugar de utilizar encuestas para recabar información sobre lo que una parte de los empleados recordaba haber hecho en algún momento.</p>



<p>El primer proyecto consistió en un proceso sencillo de siete pasos y, al crear un gemelo digital del mismo, Novo Nordisk descubrió que, dependiendo de quién lo llevara a cabo, podía tratarse de un proceso de cinco o de nueve pasos. “Si reúnes a diez expertos en la materia en una sala, obtienes todo tipo de interpretaciones y, con el tiempo, se producen desviaciones”, cuenta.</p>



<p>El proyecto puso de manifiesto múltiples fallos en los procesos existentes. En algunos casos, fue necesario volver a formar a los empleados. En uno de ellos, hubo que actualizar la interfaz de usuario. Sin embargo, una vez que se estandariza un proceso, surge la oportunidad de tomar una “fotografía” de la situación anterior, de modo que haya algo con lo que comparar posteriormente y comprobar si la mejora mediante IA o la automatización arrojan algún resultado.</p>



<p>Otra cuestión que tuvieron que resolver de antemano fue decidir qué hacer con el tiempo ahorrado que se generara. “No quieres despedir a nadie”, afirma Bova. “Se trata de personal altamente cualificado y difícil de encontrar. Quizá deberíamos plantearnos redistribuir un poco los equipos”.</p>



<p>En la actualidad, la empresa cuenta con varios cientos de agentes de IA en funcionamiento, etiquetados dentro de la infraestructura del gemelo digital para poder identificarlos. “Si algo falla, sabemos exactamente dónde solucionarlo”, dice, y añade que la siguiente fase es la coordinación entre múltiples agentes. “Hoy en día, los tenemos conectados, pero no contamos con ‘agentes de agentes”.</p>



<p>Aún es demasiado pronto para saber si hay retorno de la inversión, ya que, en el desarrollo de fármacos, el proceso lleva años. “Pero, al analizar el proceso de principio a fin, espero que podamos recortar dos años del ciclo de desarrollo. Dos años menos hasta la comercialización, en comparación con la situación actual”»”, indica.</p>



<p>Los medicamentos que ya se encuentran en la fase final de desarrollo no experimentarán una aceleración tan notable, pero los que acaban de iniciarse serán los que más se beneficien. Sin embargo, los resultados finales no se verán hasta dentro de varios años.</p>



<p>La industria farmacéutica no es la única en la que el verdadero valor proviene de la optimización simultánea de múltiples procesos interconectados. <a href="https://tsecurity.de/weiterlesen/3625872/3654011/por-qu-resulta-tan-difcil-medir-el-roi-de-la-ia/" target="_blank" rel="noopener noreferrer">Según PwC</a>, los proyectos tácticos de IA a menudo no aportan un valor cuantificable, y los beneficios tangibles provienen de implementaciones a escala empresarial coherentes con la estrategia de negocio.</p>



<p>De hecho, muchas empresas no han experimentado ni un aumento de los ingresos ni una reducción de los costes gracias a la IA en los últimos 12 meses, a pesar de su adopción casi universal. Aun así, el gasto empresarial en IA se prevé que casi se duplique a finales de año en comparación con el año pasado, según <a href="https://tsecurity.de/weiterlesen/3625872/3654011/por-qu-resulta-tan-difcil-medir-el-roi-de-la-ia/" target="_blank" rel="noopener noreferrer">KPMG</a>.</p>



<h2 class="wp-block-heading">Medición de la productividad</h2>



<p>La mayoría de las empresas empiezan a pequeña escala, implantando <em>chatbots </em>de IA para los empleados con el fin de ayudar a mejorar la productividad. Y el ritmo de adopción en este ámbito ha sido asombrosamente alto, solo equiparado por la incapacidad de medir las ganancias de productividad que se supone que se deben alcanzar.</p>



<p>Disponer de una referencia es clave, afirma Anand Rao, profesor de IA en la Universidad Carnegie Mellon, de Estados Unidos, pero en algunos casos resulta difícil de medir y, en otros, es prácticamente imposible. Tomemos, por ejemplo, las decisiones relacionadas con los seguros, en las que los resultados pueden tardar años en hacerse evidentes. En el caso de los seguros de vida, podrían ser décadas, afirma. Y para algunos tipos de decisiones, las empresas no disponen de ningún tipo de indicador.</p>



<p>“Existe un estigma social a la hora de decir que estoy tratando de analizar tu proceso de toma de decisiones y lo bien que las estás tomando. Como seres humanos, no nos gusta que se evalúen nuestras decisiones”, señala. Luego, cuando una decisión sale bien al final, la gente se atribuye encantada el mérito. “Si la decisión sale mal, se achaca a factores externos”.</p>



<p>Pero incluso en el caso de tareas específicas en las que es posible realizar mediciones, las empresas a menudo no se esfuerzan por llevarlas a cabo antes de implementar herramientas de IA. “No partimos de una referencia”, apunta Julie Averill, antigua vicepresidenta ejecutiva y directora de sistemas de información global de la cadena de moda Lululemon. Averill es ahora directora general de Gold Thread, una consultora de transformación digital. “Partimos de la suposición de que la IA iba a ayudar a la gente a tomar mejores decisiones. Y eso te lleva a no poder medir bien los resultados”, explica.</p>



<p>Existen métricas alternativas que una empresa puede tener en cuenta en su lugar, añade, como las tasas de uso o la satisfacción de los usuarios. “Esto está ocurriendo y está aportando beneficios, algunos de los cuales se pueden ver y otros no. Hay que confiar en el proceso. Es igual que con la nube. Sabes que es el camino del futuro y puedes ver las ventajas, pero es difícil llegar hasta allí, y se requieren muchos cambios. Pero cuanto antes lo hagas, antes te habrás adaptado a la nueva forma de operar y podrás sacarle realmente partido”.</p>



<p>Hay otras áreas en las que es más fácil disponer de métricas concretas, como el servicio de atención al cliente. “Se trata de tareas repetitivas y suele ser el primer ámbito que las empresas automatizan con IA. Hay resultados muy tangibles que se pueden medir y se puede establecer una referencia muy sólida”, explica Averill.</p>



<p>Lululemon también lleva años utilizando la IA para mejorar la personalización y las recomendaciones, y esa es otra área que se puede cuantificar. Además, la automatización puede reducir la introducción manual de datos, lo que disminuye las tasas de error. La IA también se puede utilizar para ayudar en la supervisión del cumplimiento normativo, la detección de fraudes y el mantenimiento predictivo de los equipos, todos ellos casos de uso que se pueden cuantificar.</p>



<p>¿Pero la productividad de los empleados en general? Eso es difícil de medir, y no solo para Lululemon. Una forma obvia podría ser analizar los despidos en profesiones expuestas a la IA. Al fin y al cabo, los titulares están por todas partes. Pero en <a href="https://tsecurity.de/weiterlesen/3625872/3654011/por-qu-resulta-tan-difcil-medir-el-roi-de-la-ia/" target="_blank" rel="noopener noreferrer">un informe publicado en marzo</a>, Anthropic no encontró indicios de un aumento del desempleo en las profesiones altamente expuestas, aquellas en las que las personas tienen más probabilidades de ser despedidas debido a la IA.</p>



<p>A principios de 2025, la empresa de investigación METR intentó cuantificar la productividad de los desarrolladores comparando la rapidez con la que los desarrolladores experimentados eran capaces de realizar tareas con IA y sin ella. ¿El resultado? Los desarrolladores afirmaron que esperaban que la IA les permitiera trabajar un 24% más rápido y estimaron que, en realidad, la IA les había permitido hacerlo un 20 % más rápido. Pero los datos revelaron una realidad totalmente diferente. El uso de la IA, en realidad, les ralentizó un 19%.</p>



<p>Por supuesto, las herramientas de IA están mejorando. METR intentó realizar un estudio de seguimiento, comparando de nuevo las tareas realizadas con y sin IA, pero no pudo encontrar suficientes desarrolladores dispuestos a volver al enfoque sin IA, a pesar de que los investigadores les pagaban por participar en el estudio.</p>



<p>Existen casos anecdóticos de empresas en las que un solo ingeniero realiza el trabajo de cien gracias al uso de la IA. O aquella vez en que se filtró accidentalmente todo el código fuente de Claude Code, de medio millón de líneas, y el desarrollador coreano Sigrid Jin creó una reconstrucción desde cero en dos horas, que luego subió a GitHub, donde se convirtió en el proyecto más rápido de la historia en alcanzar las 100.000 estrellas.</p>



<p>Pero, como ocurre con cualquier otro tema relacionado con la IA, la realidad es más compleja. En el caso concreto del desarrollo de software, escribir el código es, en realidad, solo una pequeña parte de lo que implica desarrollar software.</p>



<p>La consultora DX analizó recientemente métricas clave de ingeniería de 400 empresas y, en un informe reciente, constató que el uso de la IA había aumentado un 65% desde noviembre de 2024, pero que la productividad relacionada con la IA se situaba justo por debajo del 10%.</p>



<h2 class="wp-block-heading">Costes ocultos</h2>



<p>Al igual que resulta difícil medir los beneficios de la IA en términos de productividad, también puede resultar complicado cuantificar los costes. Cuando una empresa empieza a utilizar la IA, los costes pueden ser relativamente fáciles de estimar. ¿A cuánto ascienden las cuotas mensuales totales de suscripción a los chatbots de IA que utilizan los empleados? ¿Cuál es el coste de entrenar o ajustar un modelo personalizado? Pero cuando se pasa a casos de uso más complejos, los cálculos se vuelven más difíciles, afirma Averill. “Ahora existen todos los sistemas relacionados con la IA. Esos son más difíciles de cuantificar, pero su impacto es mayor”, dice.</p>



<p>Por ejemplo, si la IA se integra en los procesos empresariales mediante RAG, existe el gasto continuo de las llamadas a la API, pero también los cambios que hay que realizar en otros sistemas, explica. Y la cosa se complica cada día más. “No hemos realizado un esfuerzo muy concertado para implantar la telemetría y la instrumentación”, afirma Swaminathan Chandrasekaran, director global de IA y laboratorios de datos en KPMG. Según él, obtener una visión global de los costes totales de la IA en una empresa es como predecir el tiempo.</p>



<p>“La razón por la que contamos con un sistema de predicción meteorológica tan impresionante en este país es que disponemos de decenas de miles de estaciones meteorológicas que recopilan datos”, explica. “Sin eso, no sabríamos qué tiempo va a hacer”.</p>



<p>Las empresas deben implantar sistemas de medición para evaluar todos los aspectos del consumo relacionado con la IA, señala, empezando por el número de tokens utilizados, quién los utiliza y cómo se correlaciona esto con el rendimiento laboral. “Esa medición brilla por su ausencia”, afirma.</p>



<p>Al menos cuando los humanos utilizan <em>chatbots </em>de IA, hay un límite en el número de preguntas que son físicamente capaces de formular, además de unos costes de suscripción predecibles. Y cuando los procesos empresariales se habilitan con IA a través de RAG, las llamadas a la API de los modelos de lenguaje grandes (LLM) las realizan sistemas empresariales predecibles y programados de forma tradicional.</p>



<p>Pero ahora, la IA agentiva está empeorando aún más las cosas, ya que los agentes pueden actuar de forma impredecible y el número de llamadas a la API puede dispararse rápidamente fuera de control. En un informe del <a href="https://tsecurity.de/weiterlesen/3625872/3654011/por-qu-resulta-tan-difcil-medir-el-roi-de-la-ia/" target="_blank" rel="noopener noreferrer">Boston Consulting Group</a>, dos tercios de las empresas señalan gastos de escalado de la IA incontrolables.</p>



<p>Otro coste que algunas empresas quizá no prevean bien, o que no controlen porque forma parte de un presupuesto diferente, es el relacionado con los datos. Ya sea preparando datos para el entrenamiento o el ajuste fino, utilizando incrustaciones de RAG o configurando el acceso directo a MCP a través de agentes, estos costes pueden acumularse rápidamente cuando entra en escena la IA.</p>



<p>“Las tarifas de salida son uno de los gastos más importantes”, afirma Tom Coughlin, miembro del IEEE y presidente de la consultora Coughlin Associates. “Si tienes que sacar datos de la nube, esas tarifas de salida podrían ser considerables”. Además, están todos los costes de personal que conlleva la implementación de la IA, añade.</p>



<p>“A largo plazo, la IA aportará un gran valor a las personas, pero estas deben saber cómo utilizarla correctamente. Si no cuentan con esas habilidades, se encontrarán en desventaja”, expone.</p>



<h2 class="wp-block-heading">Soluciones y mensajes contradictorios</h2>



<p>Luego está la cuestión de resolver los problemas. La mayoría de las empresas han sufrido al menos un incidente relacionado con la IA en los últimos 18 meses, y la mayoría de ellos han supuesto pérdidas económicas, algunas de más de 500.000 dólares. Además, está la IA que se está integrando en todo.</p>



<p>“Conocemos nuestros costes directos”, afirma Andrew Johnson, director de sistemas de información (CIO) de Brownstein Hyatt Farber Schreck, un bufete de abogados estadounidense. “Pero donde resulta más difícil de cuantificar es con las plataformas que ya tenemos implantadas y las aplicaciones SaaS que no contaban con capacidades de IA. Nos piden aumentos extraordinarios y los atribuyen a las nuevas capacidades que aporta la IA. ¿Cuánto se le debe atribuir a la IA? Eso es un poco difuso”, relata.</p>



<p>Incluso cuando la IA permite ahorrar dinero, a menudo hay costes adicionales asociados a ello. Por ejemplo, el bufete gastaba unos 70.000 dólares al año en una plataforma de gestión de contratos. Desarrollar su propia versión con IA supuso unos 40.000 dólares en costes de mano de obra y otros 3.000 dólares al año en alojamiento. El mantenimiento continuo será mínimo para esa aplicación en concreto, añade, lo que supondrá un total de otros dos mil dólares al año.</p>



<p>Pero también hay otros costes indirectos asociados al funcionamiento de las aplicaciones propias, como las auditorías de seguridad, las evaluaciones de vulnerabilidad, las pruebas de penetración y la revisión del código. “Cuanto más compleja y arriesgada es la plataforma, menor es el interés por intentar crear una solución interna”, indica.</p>



<p>Aun así, el equipo de desarrollo de software es ahora mucho más productivo gracias a la IA, ya que cuatro o cinco desarrolladores son capaces de hacer el trabajo de 20 o 30. Pero las mejoras en la productividad no se traducen en un ahorro de mano de obra, ya que los desarrolladores tienen mucho trabajo nuevo que hacer. “Tenemos una enorme lista de oportunidades pendientes para desarrollar soluciones”, afirma.</p>



<p>La tendencia del trabajo a expandirse para ocupar todo el tiempo disponible no se da solo en el desarrollo de software, señala Rao, de Carnegie Mellon. Supongamos, por ejemplo, que se espera que la IA suponga una mejora del 20% en la productividad, explica. “Antes había cien personas haciendo ese trabajo, y ahora solo necesitamos 80. Pero, al final del año, la plantilla no ha cambiado. «En las tareas que realizaban, hay una mejora, añade, “pero las personas añadirán tareas para suplir o complementar ese 20%. No es que se vayan a casa una hora antes, sino que están encontrando otras actividades que generan valor”.</p>



<p>De hecho, en algunos casos, el aumento de la productividad en una empresa puede llegar a perjudicar los resultados. Los abogados, por ejemplo, cobran por horas. “La eficiencia va en contra de nuestras formas tradicionales de ganar dinero”, afirma Johnson, de Brownstein. “Tenemos que pensar más allá de eso. No es perjudicial para nuestros intereses a largo plazo, pero supone un reto a corto plazo. Sin embargo, si no lo hacemos, es probable que no seamos competitivos a medio y largo plazo”.</p>



<p>Así pues, si una nueva herramienta de IA ayuda a un abogado en la diligencia debida, no existe una relación directa entre la inversión en esa herramienta y el aumento de los ingresos. “Es un hecho que la dirección es la correcta”, afirma Johnson. “Pero no podemos afirmar que vaya a generar un rendimiento concreto”.</p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Why is it so hard to measure the ROI of AI?]]></title>
<description><![CDATA[Danish multinational pharmaceutical Novo Nordisk is very interested in speeding up the time it takes to get drugs to market as patents expire. “If you have a blockbuster drug, a one-week delay can be $10 to $100 million,” says Stephanie Bova, the company’s digital transformation officer. “It’s ma...]]></description>
<link>https://tsecurity.de/de/3653926/it-security-nachrichten/why-is-it-so-hard-to-measure-the-roi-of-ai/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3653926/it-security-nachrichten/why-is-it-so-hard-to-measure-the-roi-of-ai/</guid>
<pubDate>Wed, 08 Jul 2026 12:08:55 +0200</pubDate>
<content:encoded><![CDATA[<div>
		<div class="grid grid--cols-10@md grid--cols-8@lg article-column">
					  <div class="col-12 col-10@md col-6@lg col-start-3@lg">
						<div class="article-column__content">
<section class="wp-block-bigbite-multi-title"><div class="container"></div></section>



<p>Danish multinational pharmaceutical Novo Nordisk is very interested in speeding up the time it takes to get drugs to market as patents expire. “If you have a blockbuster drug, a one-week delay can be $10 to $100 million,” says Stephanie Bova, the company’s digital transformation officer. “It’s massive money because you have less time on patent.”</p>



<p>Gen AI offered the possibility of dramatically speeding up multiple steps in the drug development process. And since Novo Nordisk was already carefully tracking how long its key processes took, it had an advantage that many companies didn’t. So it should’ve been relatively simple to sprinkle in some gen AI, see productivity improve, and watch the money roll in. But it wasn’t that easy. A drug development process has many parts, happening at different times in different departments.</p>



<p>“People are experts in their own domains but don’t necessarily know the next domain and how it all fits together,” Bova says. “The system is so big and complex that you’re not able to see all the performance at once.”</p>



<p>Process documentation might not match what people actually do in practice, and different people might do the same task in different ways. And some crucial tasks might be nearly invisible from the outside. The manufacturing team, for example, might sit in a completely different group and not be aware the drug is getting ready for FDA submission, and don’t have all their documents ready yet.</p>



<p>“So you’ve run very fast only to have to wait for them to catch up,” Bova adds.</p>



<p>This is just one of many challenges companies face when trying to measure the results of AI projects, and why surveys are so contradictory.</p>



<p>Looking at individual tasks, Novo Nordisk can show productivity improvements and clear positive benefits to its use of AI. But stepping back and looking at the company’s bottom line, the picture gets murkier. First, if critical steps are missed, then time to market won’t improve. It also takes years for a new drug to get to customers, so any positive bottom-line effects won’t be felt for a while. And that’s just the start of the <a href="https://tsecurity.de/weiterlesen/3625787/3653926/why-is-it-so-hard-to-measure-the-roi-of-ai/" target="_blank" rel="noopener noreferrer">ROI measurement problem</a>.</p>



<h2 class="wp-block-heading">Process measurement</h2>



<p>To address its process blind spots, Novo Nordisk turned to the new generation of process mining: AI-powered real-time digital twins of operations.</p>



<p>“We partnered with process intelligence company Celonis to get a digital twin of our process data,” Bova says. “We were the first in the industry to apply it to the clinical setting.” The tool collects information from enterprise systems to track what employees actually do, rather than using surveys to collect information on what a fraction of employees remembered doing at some point.</p>



<p>The first project was a simple, seven-step process, and in creating a digital twin of it, Novo Nordisk discovered that, depending on who was doing it, it could be a five- or nine-step process. “If you get 10 different subject matter experts in a room, you get all kinds of interpretations, and you have drift over time,” she says.</p>



<p>The project exposed multiple flaws in existing processes. In some cases, employees needed to be retrained. In one, the user interface had to be updated. Once a process is standardized, though, there’s an opportunity to take the before picture, so there’s something to compare to afterward, to see if the AI augmentation or automation show any results.</p>



<p>Another thing they had to figure out ahead of time was decide what to do with any time savings that showed up.</p>



<p>“You don’t want to lay people off,” Bova says. “These are highly technical, hard-to-find talent. Maybe we want to think about redistributing teams a bit.”</p>



<p>Today, the company has several hundred AI agents in active deployment, tagged inside the digital twin infrastructure so they can be identified.</p>



<p>“If something screws up, we know exactly where to fix it,” she says, adding that the next phase is multi-agent orchestration. “Today, we have them connected, but we don’t have agents of agents.”</p>



<p>It’s too early to say if there’s ROI yet because, for drug development, the process takes years. “But by looking at the end-to-end process, my hope is we’ll find two years of cycle time to engineer out,” she says. “Two years quicker to market, compared to where we are now.”</p>



<p>Drugs that are already in the final phase of development won’t see as much acceleration, but those just starting out will benefit the most. The bottom line results, however, won’t show up for several years.</p>



<p>The pharmaceutical industry isn’t the only one where true value comes from optimizing multiple interconnected processes at once. <a href="https://tsecurity.de/weiterlesen/3625787/3653926/why-is-it-so-hard-to-measure-the-roi-of-ai/" target="_blank" rel="noopener noreferrer">According to PwC</a>, tactical AI projects often don’t deliver measurable value, with tangible returns coming from enterprise-scale deployments consistent with business strategy.</p>



<p>In fact, many companies have seen neither increased revenue nor decreased costs from AI in the last 12 months despite nearly universal adoption of AI. Still, enterprise spending on AI is set to nearly double by the end of the year compared to last year, according to <a href="https://tsecurity.de/weiterlesen/3625787/3653926/why-is-it-so-hard-to-measure-the-roi-of-ai/" target="_blank" rel="noopener noreferrer">KPMG</a>.</p>



<h2 class="wp-block-heading">Productivity measurement</h2>



<p>Most companies start on a smaller scale, rolling out AI chatbots to employees to help improve productivity. And the pace of adoption here has been staggeringly high, matched only by a lack of ability to measure the productivity gains that are supposed to be achieved.</p>



<p>Having a baseline is key, says Anand Rao, professor of AI at Carnegie Mellon University, but it’s difficult to measure in some cases, and all but impossible in others. Take for example insurance decisions where results can take years to show up. With life insurance, it could be decades, he says. And for some types of decisions, companies don’t have any measurements at all.</p>



<p>“There’s a social stigma to saying that I’m trying to look at your decision-making and how well you’re making the decisions,” he says. “As humans, we don’t like to be measured for our decisions.”</p>



<p>Then, when a decision turns out well in the end, people are happy to take credit. “If the decision goes badly, it’s something outside,” he says.</p>



<p>But even for specific tasks where measurement is possible, companies often don’t put in the work to make the measurements prior to rolling out AI tools. “We didn’t start with a baseline,” says Julie Averill, former EVP and global CIO of fashion retailer Lululemon. Averill is now CEO at Gold Thread, a digital transformation consultancy.</p>



<p>“We started with the assumption that AI was going to help people make better decisions,” she says. “And that sets you up to not being able to measure well.”</p>



<p>There are alternative metrics that a company can look at instead, she adds, like usage rates or user satisfaction. “This is happening, and it’s bringing benefits,” she says, “some of which you can see, and some you can’t. You have to trust the process. It’s just like the cloud. You know it’s the way of the future and you can see the benefits, but it’s hard to get there, and there’s a lot of change required. But the sooner you do that, the sooner you’re in the new way of operating and can really take advantage of it.”</p>



<p>There are other areas where hard metrics are more readily available, like customer service. “These are repeatable tasks, and it’s usually the first place companies automate with AI,” Averill says. “There are very tangible results you can measure, and you can have a very good baseline.”</p>



<p>Lululemon has also been using AI for years for better personalization and recommendations, and that’s also an area that can be quantified. And automation can reduce manual data entry, reducing error rates. AI can also be used to help with compliance monitoring, fraud detection, and predictive maintenance for equipment, which are all use cases that can be quantified.</p>



<p>But employee productivity in general? That’s a tough one to measure, and not just for Lululemon. One obvious way might be to look at layoffs in professions exposed to AI. After all, the headlines are everywhere. But in <a href="https://tsecurity.de/weiterlesen/3625787/3653926/why-is-it-so-hard-to-measure-the-roi-of-ai/" target="_blank" rel="noopener noreferrer">a report released in March</a>, Anthropic found no signs of an increase in unemployment in highly exposed professions, those in which people are most likely to be laid off due to AI.</p>



<p>In early 2025, research firm METR attempted to quantify developer productivity by comparing how fast experienced developers were able to achieve tasks with AI and without. The result? Developers said they were expecting AI to speed them up by 24%, and estimated that AI had actually sped them up by 20%. But the data showed an altogether different story. Their use of AI actually slowed them down by 19%.</p>



<p>Of course, AI tools are getting better. METR attempted to do a follow-up study, again tracking tasks done with and without AI, but they couldn’t find enough developers willing to go back to the no-AI approach, even though the researchers were paying them to participate in the study.</p>



<p>There are anecdotal reports of companies where one engineer does the work of a hundred by using AI. Or that time the entire half-million-line Claude Code codebase was accidentally leaked and Korean developer Sigrid Jin created a clean-room rebuild in two hours, which he then pushed to GitHub, where it became the fastest project in history to hit 100,000 stars.</p>



<p>But as with anything else having to do with AI, the real picture is more complicated. With software development in particular, typing the code is actually just a fraction of what’s involved in developing software.</p>



<p>Research firm DX recently analyzed key engineering metrics from 400 companies, and in a recent report found that AI usage increased by 65% since November 2024, but AI-related productivity was just under 10%.</p>



<h2 class="wp-block-heading">Hidden costs</h2>



<p>Just as it’s difficult to measure the productivity benefits of AI, it can also be tricky to measure the costs. When a company first starts using AI, costs might be relatively simple to estimate. What’s the total monthly subscription charges for the AI chatbots that employees are using? What’s the cost of training or fine-tuning a custom model? But when you move on to more complex use cases, the calculations get more difficult, says Averill.</p>



<p>“Now there are all the systems around the AI,” she says. “Those are harder to measure, but the impact is bigger.”</p>



<p>For example, if AI is embedded into business processes using RAG, there’s the ongoing expense of the API calls, but also the changes that need to be made to other systems, she says. And it just keeps getting more complicated every day.</p>



<p>“We haven’t taken a very concerted effort to putting telemetry and instrumentation in place,” says Swaminathan Chandrasekaran, global head of AI and data labs at KPMG. He says that getting a comprehensive picture of the total costs of AI in an enterprise is like predicting the weather.</p>



<p>“The reason we have a pretty awesome weather prediction system in this country is because we have tens of thousands of weather stations that aggregate data,” he says. “Without that, we wouldn’t know the weather.”</p>



<p>Companies need to set up instrumentation to measure all the aspects of AI-related consumption, he says, starting with the number of tokens used, who’s using them, and how it correlates to work output.</p>



<p>“That measurement is fundamentally lacking,” he says.</p>



<p>At least when humans are using AI chatbots, there’s a limit to how many questions they’re physically able to ask, combined with predictable subscription costs. And when business processes are AI-enabled via RAG, the API calls to LLMs are being made by predictable, traditionally-scripted business systems.</p>



<p>But now, agentic AI is making everything worse because the agents can act unpredictably, and the number of API calls can quickly spiral out of control. In a report by the <a href="https://tsecurity.de/weiterlesen/3625787/3653926/why-is-it-so-hard-to-measure-the-roi-of-ai/" target="_blank" rel="noopener noreferrer">Boston Consulting Group</a>, two-thirds of companies are reporting uncontrollable AI scaling expenses.</p>



<p>Another cost some companies might not anticipate well, or not track because it’s part of a different budget, is data-related cost. Whether preparing data for training or fine-tuning, using RAG embeddings, or setting up direct MCP access via agents, these costs can quickly add up when AI comes into the picture.</p>



<p>“Egress fees are one of the big ones,” says Tom Coughlin, IEEE fellow and president of consulting firm Coughlin Associates. “If you have to bring data out of the cloud, those egress fees could be considerable.”</p>



<p>Then there are all the <a href="https://tsecurity.de/weiterlesen/3625787/3653926/why-is-it-so-hard-to-measure-the-roi-of-ai/" target="_blank" rel="noopener noreferrer">human costs of deploying AI</a>, he adds.</p>



<p>“There’ll be a lot of value that people get out of AI in the long run, but they need to know how to use it properly,” he says. “If they don’t have those skills, you’ll be at a disadvantage.”</p>



<h2 class="wp-block-heading">Solutions and mixed messages</h2>



<p>Then there’s fixing problems. A majority of companies have had at least one AI-related incident in the last 18 months, with most resulting in financial loss, some over $500,000. Then there’s the AI that’s being embedded in everything.</p>



<p>“We know our direct costs,” says Andrew Johnson, CIO at Brownstein Hyatt Farber Schreck, a leading national law firm. “But where it becomes more difficult to measure is with platforms we already have in place, and SaaS applications that didn’t have AI capabilities,” he says. “They’re asking for extraordinary increases and attribute them to new capabilities due to AI. How much should be ascribed to AI? That’s a little wishy-washy.”</p>



<p>Even when AI saves money, there are often extra costs associated with that. For example, the firm was spending about $70,000 a year on a contract management platform. Building their own version with AI took about $40,000 in labor costs and another $3,000 a year for hosting. Ongoing maintenance will be minor for that particular application, he adds, totaling another couple of thousand a year.</p>



<p>But there are also other indirect costs that come with running your own applications, including security audits, vulnerability assessments, penetration tests, and code review.</p>



<p>“The more complex and riskier the platform, the less appetite there is for trying to create an in-house solution,” he says.</p>



<p>Still, the software development team is now dramatically more productive as a result of AI, with four or five developers able to do the work of 20 or 30.</p>



<p>But the productivity improvements don’t translate to labor savings, since there’s plenty of new work for the developers to do. “We have an enormous backlog of opportunities to develop solutions,” he says.</p>



<p>The tendency of work to expand to fill the time available isn’t just true for software development, says Carnegie Mellon’s Rao.</p>



<p>Say for example, AI is expected to lead to a 20% improvement in productivity, he says. “There were a hundred people doing it, and now we only need 80.” But at the end of the year, headcount hasn’t changed. “The tasks they were doing, there’s improvement,” he adds “But humans will add tasks to supplement or complement that 20%. It’s not that they’re going home an hour early, but they’re finding other value-generating activities.”</p>



<p>In fact, in some cases, increased productivity at a company can actually hurt the bottom line. Lawyers, for example, bill by the hour.</p>



<p>“Efficiency runs counter to our traditional ways of making money,” says Brownstein’s Johnson. “We have to think past that. It’s not detrimental to our long-term interest, but it’s a challenge in the short term. If we don’t do this, though, it’s likely we won’t be competitive in the mid- to long-term.”</p>



<p>So if a new AI tool helps an attorney with due diligence, there’s no straight line between the investment in that tool and increased revenues.</p>



<p>“It’s a given that it’s directionally right,” Johnson says. “But we can’t say it’s going to lead to a particular return.”</p>
</div></div></div></div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Enola Holmes 3 Starts at No. 1, But Its Viewership Is Down Nearly 60%]]></title>
<description><![CDATA[Enola Holmes 3 is now streaming on Netflix, but its first-week viewership has raised a big question: is Enola Holmes 4 still a safe bet?



Enola Holmes 3 Release Details




Release date: July 1, 2026



Platform: Netflix



Genre: Mystery, adventure, period drama



Runtime: 105 minutes



Dire...]]></description>
<link>https://tsecurity.de/de/3653595/apple-ios-macos/enola-holmes-3-starts-at-no-1-but-its-viewership-is-down-nearly-60/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3653595/apple-ios-macos/enola-holmes-3-starts-at-no-1-but-its-viewership-is-down-nearly-60/</guid>
<pubDate>Wed, 08 Jul 2026 09:54:43 +0200</pubDate>
<content:encoded><![CDATA[Enola Holmes 3 is now streaming on Netflix, but its first-week viewership has raised a big question: is Enola Holmes 4 still a safe bet?



Enola Holmes 3 Release Details




Release date: July 1, 2026



Platform: Netflix



Genre: Mystery, adventure, period drama



Runtime: 105 minutes



Director: Philip Barantini



Writer: Jack Thorne



Main cast: Millie Bobby Brown, Louis Partridge, Henry Cavill, Helena Bonham Carter, Himesh Patel, Sharon Duncan-Brewster




Where The Story Goes



Spoilers ahead.



The third movie moves Enola’s story from London to Malta, where Enola Holmes and Lord Tewkesbury are preparing for their wedding. The celebration does not last long, as Sherlock Holmes is kidnapped and Enola is forced back into detective mode.



The movie gives fans more romance, more danger, and a larger international setting. It also pushes Enola into a more mature phase of life, where personal choices and family loyalty collide.



Enola Holmes 3 Viewership Drops From The Second Movie



Netflix’s latest global Top 10 data shows that Enola Holmes 3 opened with 20.7 million views and ranked No. 1 among English-language films for the week.



That sounds strong, but the comparison with Enola Holmes 2 is not as positive. The second movie opened with 29.3 million views in its first week. That means the third movie is down by around 29% on raw numbers.



The bigger concern is the release window. Enola Holmes 2 arrived on a Friday and had only three days counted in its opening week. Enola Holmes 3 arrived on a Wednesday, giving it five days to collect views.



When the daily average is compared, the drop is much sharper. The second movie averaged around 9.8 million views per day, while the third averaged around 4.1 million views per day. That puts the decline close to 58%.



Could Enola Holmes 4 Be In Doubt?



Netflix has not announced Enola Holmes 4 yet. The franchise still has big names, a loyal audience, and Millie Bobby Brown remains one of Netflix’s most important stars.



Still, the lower opening makes the next decision more interesting. A fourth movie will depend on how well Enola Holmes 3 holds in the coming weeks. If the movie stays strong in the Top 10, Netflix has a reason to continue. If it drops quickly, the streamer may think more carefully before moving ahead.



For now, Enola Holmes 3 is a successful No. 1 debut, but it has not matched the momentum of the previous film.



What do you plan to watch this weekend? Let us know in the comments.]]></content:encoded>
</item>
<item>
<title><![CDATA[The Postgres Creator Says LLMs Score 0% on Real Databases]]></title>
<description><![CDATA[Mike Stonebraker has been right before. He built Ingres in 1972, then Postgres in the 1980s, then predicted the death of general-purpose databases in 2005. Every time, the industry caught up years later. Now he is saying something that should make every company betting on "chat with your data" ve...]]></description>
<link>https://tsecurity.de/de/3653365/sichere-programmierung/the-postgres-creator-says-llms-score-0-on-real-databases/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3653365/sichere-programmierung/the-postgres-creator-says-llms-score-0-on-real-databases/</guid>
<pubDate>Wed, 08 Jul 2026 07:57:31 +0200</pubDate>
<content:encoded><![CDATA[<p>Mike Stonebraker has been right before. He built Ingres in 1972, then Postgres in the 1980s, then predicted the death of general-purpose databases in 2005. Every time, the industry caught up years later. Now he is saying something that should make every company betting on "chat with your data" very nervous.</p>

<p>In a recent interview on the <em>Data Renegades</em> podcast, the Turing Award winner revealed that LLMs score 0% accuracy on real-world data warehouse queries. Not 80%, which is what the popular benchmarks report. Zero.</p>

<p><a href="https://tsecurity.de/weiterlesen/3625226/3653365/the-postgres-creator-says-llms-score-0-on-real-databases/" target="_blank" rel="noopener noreferrer">Watch the full interview</a></p>

<h2>
  
  
  The 80% benchmark is a lie
</h2>

<p>The text-to-SQL leaderboard tells a reassuring story. On popular benchmarks like Spider and Bird, the best LLM systems hit 80-85% accuracy. Impressive. Almost production-ready.</p>

<p>Stonebraker tested the same models on four real production data warehouses. Not synthetic data. Not academic datasets. Actual enterprise systems with actual workloads from actual users.</p>

<p>The result: <strong>0% accuracy</strong>. Add RAG and every trick in the book: <strong>10%</strong>. Hand the model the exact FROM clause and all JOIN terms on a silver platter: <strong>35%</strong>.</p>

<p>A knowledgeable SQL programmer with access to the schema? 90%+.</p>

<p>This is not a small gap. This is the difference between "almost there" and "does not work at all."</p>

<h2>
  
  
  Why real databases break LLMs
</h2>

<p>Stonebraker identified four reasons the benchmarks are meaningless for production use:</p>

<p><strong>1. Enterprise data is not in the training set.</strong> LLMs are trained on "the pile," the massive web corpus. Your data warehouse is not in the pile. And if an LLM has not seen data a couple times before, it has almost no chance of reasoning about it correctly.</p>

<p><strong>2. Real queries are 5x more complex.</strong> Spider and Bird benchmarks use queries that are 10-20 lines of SQL. Real data warehouse queries run 100+ lines. The complexity scales non-linearly.</p>

<p><strong>3. Real schemas are a mess.</strong> Academic benchmarks have clean, mnemonic table and column names like <code>employees.salary</code>. Real data warehouses have materialized views everywhere (creating redundancy), column names like <code>ZUPPERS_BLAH</code>, and idiosyncratic naming conventions built up over decades.</p>

<p><strong>4. Idiosyncratic data.</strong> Stonebraker gives the example of "J-term" at MIT, a one-month January term. Not unique to MIT, but not common enough to appear in training data. Every enterprise has dozens of such domain-specific concepts that no LLM has ever seen.</p>

<p>Stonebraker published these benchmarks as BEAVER, an anonymized version of the four real data warehouses, available on <a href="https://tsecurity.de/weiterlesen/3625226/3653365/the-postgres-creator-says-llms-score-0-on-real-databases/" target="_blank" rel="noopener noreferrer">arXiv</a>. His message to AI researchers: "If you think you're really good at text-to-SQL, try a real benchmark, not a fake one."</p>

<h2>
  
  
  The Oracle playbook, 1980s edition
</h2>

<p>Stonebraker has seen tech hype cycles before. He built Ingres at Berkeley in 1972 and commercialized it in 1980. The competition was Larry Ellison's Oracle.</p>

<p>His assessment of how Oracle competed is blunt. "Larry Ellison is a fabulous salesman. He made present tense and future tense indistinguishable. He basically lied to customers."</p>

<p>The example he gives is telling. Ingres implemented referential integrity, the database constraint that ensures data consistency (if you fire the last employee in a department, should the department still exist?). Oracle wrote two manual pages defining referential integrity, then added at the bottom: "Not yet implemented."</p>

<p>Customers bought Oracle anyway. The feature was on the roadmap. The documentation existed. The code did not. Sound familiar? It is the same playbook playing out today with AI companies shipping demos of capabilities that do not work in production.</p>

<h2>
  
  
  "One size fits none"
</h2>

<p>In 2004, Stonebraker published a paper arguing that general-purpose databases were doomed. "One Size Fits All: An Idea Whose Time Has Come and Gone" (<a href="https://tsecurity.de/weiterlesen/3625226/3653365/the-postgres-creator-says-llms-score-0-on-real-databases/" target="_blank" rel="noopener noreferrer">Brown University PDF</a>) showed that specialized engines outperformed general-purpose systems by an order of magnitude in specific workloads.</p>

<p>Column stores like Vertica and ClickHouse destroy row stores for analytics. Stream processors like StreamBase (which Stonebraker also built) bear no resemblance to relational databases. Pinecone is faster than user-defined types on Postgres for vector search.</p>

<p>His take on Postgres today is surprisingly honest: "At the low end, it's absolutely the right one-size-fits-all. At the high end, that's just not true." Postgres has no column store, no multi-node support, and is not competitive for sizable data warehouses. For getting started, it is the right choice. For petabyte-scale analytics, it is table stakes that it does not have.</p>

<h2>
  
  
  The most controversial take: computer science may not be a growth industry
</h2>

<p>At 83, Stonebraker has no incentive to be cautious. When asked what he would major in if starting today, his answer was blunt:</p>

<p>"Computer science may well not be a growth industry going forward. I'm not sure I would recommend 18-year-olds to major in computer science. Health care and the building trades are safe bets. Everything else looks much riskier."</p>

<p>This from the man who built the database that runs much of the internet.</p>

<p>His reasoning is consistent with his entire career. He has always bet against incumbents and conventional wisdom. The conventional wisdom in 2026 is "learn to code, AI will just make you faster." Stonebraker's counter: if AI makes every coder 10x faster, you need 10x fewer coders. The math is not complicated.</p>

<h2>
  
  
  DBOS: Replacing the operating system with a database
</h2>

<p>Stonebraker's current project is DBOS (Database-Oriented Operating System), born from a collaboration with Matei Zaharia, the creator of Apache Spark and co-founder of Databricks. The insight: Databricks was scheduling a million Spark jobs at any given time, and no existing OS scheduler could handle that scale. So they put all the scheduling data in Postgres and let a database application do the scheduling.</p>

<p>Then it clicked. Most of what an operating system does is manage data at scale. Why not replace the upper half of Linux with a database?</p>

<p>The academic project showed that a file system built on top of a DBMS is faster than the Linux file system. The scheduling engine is competitive. Everything fails over automatically. High availability comes for free.</p>

<p>When Stonebraker mentioned this to OS folks, "they got very, very threatened. The database guys are trying to take over their turf." Same reaction from programming language folks when he suggested the runtime for a programming environment should be a database.</p>

<p>DBOS is now a commercial product (<a href="https://tsecurity.de/weiterlesen/3625226/3653365/the-postgres-creator-says-llms-score-0-on-real-databases/" target="_blank" rel="noopener noreferrer">dbos.dev</a>), offering durable workflows in TypeScript, Java, Go, and Python. Two-thirds of their customers are building agentic AI. The key insight: most agentic AI today is read-only (generate a prediction). But it is moving to read-write, and that is a distributed database problem. You want atomicity, consistency, and transactions. Moving $100 between accounts using two AI agents requires both to commit or both to roll back. That is what databases were built for.</p>

<h2>
  
  
  What this means for engineers
</h2>

<p>Three takeaways from Stonebraker's career and current work:</p>

<p><strong>1. "Chat with your database" is not production-ready.</strong> The benchmarks are gamed. Real enterprise data is messy, complex, and full of domain-specific knowledge that LLMs have never seen. If you are building a product that depends on text-to-SQL working reliably, test it on your actual data warehouse, not Spider.</p>

<p><strong>2. Specialized always wins at scale.</strong> Postgres is the right choice for getting started. But if you are running a petabyte data warehouse, you need a column store. If you are doing vector search, you need a vector database. If you are processing streams, you need a stream processor. The one-size-fits-all era is over at the high end.</p>

<p><strong>3. Agentic AI needs database fundamentals.</strong> When AI agents start writing to databases, you need transactions, consistency, and durability. That is not an AI problem. It is a database problem. The engineers who understand both worlds, AI and database internals, will be the ones building the systems that actually work.</p>

<p>Stonebraker's career is a masterclass in betting against the herd. He was right about specialized databases. He was right about MapReduce being inefficient (Google eventually abandoned it). He was right about eventual consistency being wrong for most use cases (Google abandoned that too with Spanner). His track record on text-to-SQL should make you pause before trusting the benchmark numbers.</p>




<p><em>Sources: <a href="https://tsecurity.de/weiterlesen/3625226/3653365/the-postgres-creator-says-llms-score-0-on-real-databases/" target="_blank" rel="noopener noreferrer">Data Renegades Podcast - Mike Stonebraker Interview</a>, <a href="https://tsecurity.de/weiterlesen/3625226/3653365/the-postgres-creator-says-llms-score-0-on-real-databases/" target="_blank" rel="noopener noreferrer">BEAVER Benchmark (arXiv)</a>, <a href="https://tsecurity.de/weiterlesen/3625226/3653365/the-postgres-creator-says-llms-score-0-on-real-databases/" target="_blank" rel="noopener noreferrer">Recce Blog: Benchmarks Lie</a>, <a href="https://tsecurity.de/weiterlesen/3625226/3653365/the-postgres-creator-says-llms-score-0-on-real-databases/" target="_blank" rel="noopener noreferrer">One Size Fits All paper (Brown University)</a>, <a href="https://tsecurity.de/weiterlesen/3625226/3653365/the-postgres-creator-says-llms-score-0-on-real-databases/" target="_blank" rel="noopener noreferrer">DBOS</a>, <a href="https://tsecurity.de/weiterlesen/3625226/3653365/the-postgres-creator-says-llms-score-0-on-real-databases/" target="_blank" rel="noopener noreferrer">DBOS Wikipedia</a></em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Prompt Quality Report: What 1,000 Scored Prompts Reveal]]></title>
<description><![CDATA[Quick answer: The PromptEval Prompt Quality Report scored over 1,000 real prompts across 12 use cases. The average was 52 out of 100, and only 8% reached "good" (75+). The strongest single predictor of a good prompt is whether it defines its output format, worth 27 points on average. In 9 of 10 p...]]></description>
<link>https://tsecurity.de/de/3653000/sichere-programmierung/the-prompt-quality-report-what-1000-scored-prompts-reveal/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3653000/sichere-programmierung/the-prompt-quality-report-what-1000-scored-prompts-reveal/</guid>
<pubDate>Wed, 08 Jul 2026 02:33:03 +0200</pubDate>
<content:encoded><![CDATA[<blockquote>
<p><strong>Quick answer:</strong> The PromptEval Prompt Quality Report scored over 1,000 real prompts across 12 use cases. The average was 52 out of 100, and only 8% reached "good" (75+). The strongest single predictor of a good prompt is whether it defines its output format, worth 27 points on average. In 9 of 10 prompts, the weakest dimension was robustness.</p>
</blockquote>

<p>This is the <strong>PromptEval Prompt Quality Report</strong>. Over 1,000 real prompts have been scored on <a href="https://tsecurity.de/weiterlesen/3624861/3653000/the-prompt-quality-report-what-1000-scored-prompts-reveal/" target="_blank" rel="noopener noreferrer">PromptEval</a>, submitted by real users across use cases from customer support to healthcare to code. Each was scored from 0 to 100 on four structural dimensions: clarity, specificity, structure, and robustness. Every figure below comes from that set. No prompt text is stored; the analysis is anonymous and aggregate.</p>

<blockquote>
<p><strong>Only 8% of the 1,000+ scored prompts reached "good" (75 or higher). Fewer than 1% reached "excellent."</strong><br>
<em>Source: PromptEval Prompt Quality Report, 2026</em></p>
</blockquote>

<h2>
  
  
  How the scores break down
</h2>

<p>Here is how the scores spread across the set. The bar for "good" is 75, the point where a prompt is clear, specified, and holds up under variation.</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Score range</th>
<th>Share of prompts</th>
</tr>
</thead>
<tbody>
<tr>
<td>0 to 40 (failing)</td>
<td>25%</td>
</tr>
<tr>
<td>41 to 60 (below par)</td>
<td>31%</td>
</tr>
<tr>
<td>61 to 74 (functional but mediocre)</td>
<td>36%</td>
</tr>
<tr>
<td>75 to 84 (good)</td>
<td>8%</td>
</tr>
<tr>
<td>85 to 100 (excellent)</td>
<td>under 1%</td>
</tr>
</tbody>
</table></div>

<p>Roughly 92% of prompts never reach "good," and almost none reach "excellent." This includes prompts from people who clearly know the tools. The gap is not talent. It is a few missing pieces that repeat.</p>

<h2>
  
  
  What separates a good prompt from a bad one
</h2>

<p>For each structural element, we compared the average score of prompts that had it against those that did not. These are averages across the set, not a controlled experiment, so read them as correlation. But the gaps were large and consistent.</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>The prompt...</th>
<th>Avg with</th>
<th>Avg without</th>
<th>Point gap</th>
</tr>
</thead>
<tbody>
<tr>
<td>Defines the output format</td>
<td>58</td>
<td>31</td>
<td>+27</td>
</tr>
<tr>
<td>Has explicit constraints (what not to do)</td>
<td>63</td>
<td>41</td>
<td>+22</td>
</tr>
<tr>
<td>Assigns a role or persona</td>
<td>57</td>
<td>42</td>
<td>+15</td>
</tr>
<tr>
<td>Includes at least one example</td>
<td>64</td>
<td>51</td>
<td>+13</td>
</tr>
</tbody>
</table></div>

<blockquote>
<p><strong>Prompts that define their output format score 27 points higher on average than those that do not (58 vs 31). It is the single strongest predictor in the data.</strong><br>
<em>Source: PromptEval Prompt Quality Report, 2026</em></p>
</blockquote>

<p>The order matters. The widest gap by a large margin is <strong>not telling the model what shape the answer should take</strong>. It was also the single most skipped element in the whole dataset. This lines up with what the major prompting guides have said for years: <a href="https://tsecurity.de/weiterlesen/3624861/3653000/the-prompt-quality-report-what-1000-scored-prompts-reveal/" target="_blank" rel="noopener noreferrer">Anthropic</a> and <a href="https://tsecurity.de/weiterlesen/3624861/3653000/the-prompt-quality-report-what-1000-scored-prompts-reveal/" target="_blank" rel="noopener noreferrer">OpenAI</a> both push defining the output format, giving the model a role, and showing examples, and few-shot prompting has been documented since the GPT-3 paper (Brown et al., 2020). What the data adds is a price tag on each one.</p>

<h2>
  
  
  The universal weak spot: robustness
</h2>

<p>Across the whole set, one dimension came out weak far more often than the other three. In 9 out of 10 prompts, the lowest of the four scores was robustness: how the prompt handles bad, ambiguous, or unexpected input.</p>

<blockquote>
<p><strong>In 9 of 10 scored prompts, robustness was the weakest of the four dimensions.</strong><br>
<em>Source: PromptEval Prompt Quality Report, 2026</em></p>
</blockquote>

<p>Almost nobody writes the line "if the input is missing the actual question, ask one clarifying question instead of guessing." So the prompt works in the demo and falls apart the first time a real user pastes something messy. If you want the full breakdown of this failure mode, <a href="https://tsecurity.de/weiterlesen/3624861/3653000/the-prompt-quality-report-what-1000-scored-prompts-reveal/" target="_blank" rel="noopener noreferrer">we cover robustness and edge cases here</a>.</p>

<h2>
  
  
  Short prompts almost never win
</h2>

<p>Length is not a virtue on its own, but the data is blunt about the floor.</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Prompt length</th>
<th>Avg score</th>
</tr>
</thead>
<tbody>
<tr>
<td>Under 200 characters</td>
<td>27</td>
</tr>
<tr>
<td>200 to 800</td>
<td>45</td>
</tr>
<tr>
<td>800 to 2,000</td>
<td>59</td>
</tr>
<tr>
<td>Over 2,000</td>
<td>67</td>
</tr>
</tbody>
</table></div>

<p>The score climbs steadily with length, not because padding helps, but because you cannot fit a format spec, a couple of constraints, and an example into one sentence. A one-line prompt scored 27 on average, squarely in the failing tier.</p>

<h2>
  
  
  Some fields write better prompts than others
</h2>

<p>Broken down by use case, the pattern is telling. Fields where a wrong answer carries a real cost wrote the most careful prompts.</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Use case</th>
<th>Avg score</th>
</tr>
</thead>
<tbody>
<tr>
<td>Healthcare, HR, research</td>
<td>56 to 60</td>
</tr>
<tr>
<td>Data analysis, content, support</td>
<td>53 to 55</td>
</tr>
<tr>
<td>Coding, education</td>
<td>51 to 52</td>
</tr>
<tr>
<td>Marketing, creative</td>
<td>47</td>
</tr>
</tbody>
</table></div>

<p>Marketing and creative prompts scored lowest, usually because they lean on vague quality words like "engaging" or "compelling" instead of a concrete spec. The model cannot optimize against a vibe.</p>

<h2>
  
  
  Before and after, with the score
</h2>

<p>Here is a weak prompt and the same request rebuilt with the levers above. The jump shows where the points came from.</p>

<p><strong>Before (score 34):</strong> <em>"Write a support reply for this customer message."</em> No role, no format, no constraints, and no handling for a message that is not actually a support request.</p>

<p><strong>After (score 78):</strong> <em>"You are a customer support agent for a SaaS product. Given a message, reply in 2 to 3 sentences, friendly and specific, and never promise a refund or a timeline. If the message is not a support request, reply only with: 'Could you tell me what you need help with?'"</em></p>

<p>Same task. The role, the format ("2 to 3 sentences"), the constraint ("never promise a refund"), and the edge-case rule together moved it 44 points, from failing to good.</p>

<h2>
  
  
  What the data means for your prompts
</h2>

<p>Taken at face value, most weak prompts move up a tier with four additions:</p>

<ul>
<li>
<strong>Format:</strong> state the exact shape of the answer (length, structure, fields). Worth the most.</li>
<li>
<strong>Constraints:</strong> one or two "do not" rules that fence off the ways it can go wrong.</li>
<li>
<strong>Role:</strong> one line telling the model who it is and what it is for.</li>
<li>
<strong>Edge case:</strong> what to do when the input is bad or missing. The line nobody writes.</li>
</ul>

<p>You do not have to guess whether your prompt has these. Paste it into the free <a href="https://tsecurity.de/weiterlesen/3624861/3653000/the-prompt-quality-report-what-1000-scored-prompts-reveal/" target="_blank" rel="noopener noreferrer">PromptEval</a> evaluator and you get a 0 to 100 score across all four dimensions, with the specific gaps named. For the method behind the score, <a href="https://tsecurity.de/weiterlesen/3624861/3653000/the-prompt-quality-report-what-1000-scored-prompts-reveal/" target="_blank" rel="noopener noreferrer">this guide walks through evaluating prompt quality</a>, and <a href="https://tsecurity.de/weiterlesen/3624861/3653000/the-prompt-quality-report-what-1000-scored-prompts-reveal/" target="_blank" rel="noopener noreferrer">this one explains the four dimensions</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Why Mixed Asians Are Creole Too]]></title>
<description><![CDATA[At its inception, the term Creole was a tool of necessity, coined not to catalog a precise racial formula, but to map a simple geographic reality. Rooted in the Portuguese crioulo, it was designed to differentiate the immigrant who stepped off the boat from the child born directly onto the new so...]]></description>
<link>https://tsecurity.de/de/3652915/sichere-programmierung/why-mixed-asians-are-creole-too/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3652915/sichere-programmierung/why-mixed-asians-are-creole-too/</guid>
<pubDate>Wed, 08 Jul 2026 01:12:58 +0200</pubDate>
<content:encoded><![CDATA[<p>At its inception, the term Creole was a tool of necessity, coined not to catalog a precise racial formula, but to map a simple geographic reality. Rooted in the Portuguese crioulo, it was designed to differentiate the immigrant who stepped off the boat from the child born directly onto the new soil. It was the word for the clean break—the moment a diaspora stops merely visiting a landscape and begins to be raised by it. It belonged to the first generation whose worldview was shaped not by a distant homeland they had never seen, but by the brilliant, messy collision of cultures right outside their door.</p>

<p>To map the true footprint of this word requires abandoning the shoreline of the Atlantic entirely and following the trade winds. If you trace the wake of wooden ships and the migration of families across the globe, you find a concept that refuses to stay anchored to any single empire's formula. The journey might begin on the coast of West Africa, in the bustling streets of Freetown, where the cadence of Sierra Leone Krio rolls through the markets—a language forged by liberated people returning across an ocean, weaving English syntax with the deep rhythms of Yoruba, while the air carries the scent of cassava bread and slow-simmered groundnut stew. </p>

<p>But push further east, past the Cape of Good Hope, and the colors change entirely. Drop anchor in the middle of the Indian Ocean, in the volcanic landscapes of Mauritius or the Seychelles, and you enter a world where Kreol is the air everyone breathes. Here, the language sounds like French but moves with an entirely different soul, and the national palate tells the exact same story. In Mauritian kitchens, the traditional French rougaille—a rich, pounded tomato sauce—is transformed by the searing heat of local chilies and a fragrant tempering of mustard seeds, turmeric, and curry leaves brought by Tamil and Hindi laborers who planted their own roots deep into the island soil generations ago. </p>

<p>The voyage doesn’t stop at the edges of the Indian Ocean. Cross into the Pacific, and the linguistic and culinary tapestries fracture into brilliant new patterns. Step ashore in Zamboanga in the southern Philippines, and you will hear Chavacano, a vibrant, centuries-old Spanish-based creole spoken by families who cook over fires that reduction-simmer curacha crabs in alavar sauce—a decadent, golden fusion of native coconut milk, Spanish spices, and Southeast Asian lemongrass. Sail down toward the Malay Peninsula, into the historic port of Malacca, and you will find the Kristang people, speaking a unique Portuguese-Malay creole and serving kari debal (Devil’s Curry), a fiery, vinegar-spiked dish where European braising techniques collide with a heavy, aromatic paste of local galangal, candlenuts, and lemongrass. In every single one of these ports, the world looks at this spontaneous synthesis of humanity and accepts it without question. </p>

<p>This blending is not a recent phenomenon, nor is it isolated to distant islands. Even within the early American colonies, Asian presence intertwined with local landscapes, quietly weaving into the emerging cultural fabric long before modern census categories attempted to box them in. As early as the 16th and 17th centuries, the Manila Galleons brought thousands of Filipinos and Asians—historically recorded as Indios Chinos—to the shores of colonial Mexico and Louisiana. By the mid-1700s, Filipino sailors had established Saint Malo in the bayous of Louisiana, building a permanent, self-sustaining village of stilt houses. They didn't just build homes; they introduced the sun-drying of shrimp to the wetlands, a preservation technique that fundamentally altered the deep, umami baselines of local coastal cooking. In British North America, records from the 1780s show East Indian sailors and servants settling in colonial Pennsylvania and Massachusetts, marrying into the local communities and bringing the first intimations of complex spice-grinding to New England pantries. These individuals weren't merely visitors; they became part of the landscape, their stories quietly absorbed into the early colonial tapestry.</p>

<p>When this geographic concept took root on American soil, its definition did not remain static; it shifted shape constantly depending on the region's political anxieties. In early colonial Virginia, South Carolina, and New England, Creole was simply used in estate ledgers to mark any person, horse, or crop born in the colonies rather than imported from Europe or Africa. Yet, move south to Spanish and French Louisiana, and the word assumed entirely different social weight. There, it became a proud badge of local distinction, claimed fiercely by white elites of French and Spanish descent to prove they were native to the territory, while simultaneously being used by people of color to describe a rich Afro-European cultural synthesis. </p>

<p>As the plantation system solidified, this regional fluidity was overtaken by an agonizing social calculus. The cultural kaleidoscope was forced through the narrow filter of colorism, turning a word meant for geography into a tool for racial stratification. Inclusion, privilege, and the social right to claim a Creole identity became transactional, heavily guarded by proximity to whiteness. This anxiety crystallized in practices like the brown paper bag test, where communities measured belonging against a standard of light skin and European features. </p>

<p>The deepest irony of this colorist era lies in its silent omissions. Throughout the 19th and early 20th centuries, there were women of Afro-Asian descent—born from the blending of Black, Chinese, or South Asian families in these coastal hubs—who possessed the exact same skin tones, navigated the exact same neighborhoods, and met the exact same aesthetic standards as those inside the recognized Creole elite. Yet, because their heritage held threads of Canton or Calcutta rather than Paris or Madrid, they were left completely invisible in the narrative. The gate was guarded not by an objective appreciation for cultural synthesis, but by an arbitrary imperial preference for which specific lineages were acceptable to blend.</p>

<p>It is precisely because the word has spent centuries being bent, weaponized, and reimagined that it is time to let it evolve to its natural conclusion. To insist that Creole must remain frozen in an 18th-century plantation ledger is to suffer from a strange kind of colonial Stockholm syndrome. We are essentially allowing long-dead European bureaucrats to dictate who gets to belong to the modern world—and they couldn't even agree on the paperwork themselves. While the French and Spanish institutionalized the word, the British actively fled from it out of sheer cultural insecurity, dismissing the brilliant linguistic syntheses of their own colonies as mere "patois" or "broken English." </p>

<p>The underlying logic of the modern gatekeeper is that for a cultural fusion to be validly "Creole," it must have been mixed under a very specific European flag. But if your ancestral blending happened natively within a vibrant Asian fusion country or a modern nation-state, your seat at the table is revoked. It implies that when European and African histories collided on a shoreline, the rules of a brave new world applied—but when Asian histories met those exact same shores, time stood still and their descendants remained permanently "just off the boat."</p>

<p>To insist that the word remain frozen in a singular historical moment is to misunderstand the very physics of language. Words, like the people who speak them, are migratory. But Creole is unique: its entire linguistic blueprint is predicated on adaptation, synthesis, and movement. It is not a static monument to the past, but an active, ever-evolving verb. To domesticate it, to trap it within the rigid borders of a single century or a single ocean, is to deny it the very dynamism that gave it life.</p>

<p>But language, like humanity, refuses to be kept in a museum display case. Creole is not a static monument to past tragedies; it is a living, breathing, migratory verb. It is a word built on the absolute physics of adaptation and movement. When mixed Asians claim this identity, they aren't hijacking someone else's history—they are practicing their birthright. Creole culture is supposed to grow, to spill over its borders, and to offer a home to the beautifully uncategorizable people of the world when purist definitions fail them. So let’s stop doing the clerical work for old empires. By recognizing that Asians are Creole too, we don't lose the boundaries of the culture—we finally allow it to be exactly what it was always meant to be: entirely, beautifully free.</p>

<p>Content Notice: This piece was written with the assistance of AI. The core ideas, historical context, and personal perspective are entirely my own, while AI was used to help structure, refine, and polish the phrasing.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[133 People Started My App's Onboarding. One Finished. Here's Everything I Learned Building Toffee.]]></title>
<description><![CDATA[Building a personal finance app nights-only, one hour at a time, while working a full-time engineering job.

I'm a software engineer by day. By night, after my daughter goes to bed, I get roughly one hour to build. That constraint shaped every decision in this story, and honestly, I think it made...]]></description>
<link>https://tsecurity.de/de/3652275/sichere-programmierung/133-people-started-my-apps-onboarding-one-finished-heres-everything-i-learned-building-toffee/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3652275/sichere-programmierung/133-people-started-my-apps-onboarding-one-finished-heres-everything-i-learned-building-toffee/</guid>
<pubDate>Tue, 07 Jul 2026 19:00:02 +0200</pubDate>
<content:encoded><![CDATA[<p>Building a personal finance app nights-only, one hour at a time, while working a full-time engineering job.</p>

<p>I'm a software engineer by day. By night, after my daughter goes to bed, I get roughly one hour to build. That constraint shaped every decision in this story, and honestly, I think it made the product better.</p>

<p>This is the story of building <a href="https://tsecurity.de/weiterlesen/3624136/3652275/133-people-started-my-apps-onboarding-one-finished-heres-everything-i-learned-building-toffee/" target="_blank" rel="noopener noreferrer">Toffee</a>, a debt payoff app for iOS and Android, and the mistakes, wins, and one truly humbling analytics discovery along the way.</p>

<p>The idea</p>

<p>Debt payoff apps aren't new. Snowball vs. avalanche calculators have existed forever. But most of them feel like spreadsheets wearing a trench coat. I wanted something that felt warm and encouraging, because paying off debt is an emotional grind more than a math problem. The name Toffee, the warm orange and dark brown palette, the whole vibe was intentional: this should feel like a treat, not a tax audit.</p>

<p>The stack</p>

<p>With one hour a night, I couldn't afford to fight my tools. So I picked things I already knew cold:</p>

<p>Expo / React Native for the app itself. One codebase, both stores.<br>
Supabase for auth, Postgres, and edge functions. The generous free tier and the fact that it's just Postgres made it a no-brainer for a bootstrapper.<br>
Plaid for bank sync, so users don't have to manually enter every balance.<br>
RevenueCat for subscriptions and paywall management.<br>
PostHog for analytics. Remember this one. It's about to become the main character.<br>
Anthropic's Claude Haiku powering an AI feature called Toffee Coach.</p>

<p>Nothing exotic. Boring technology, shipped consistently, beats clever technology shipped never.</p>

<p>Shipping v1 through v4 in one-hour increments</p>

<p>The one-hour constraint forces a specific working style. You can't hold a big refactor in your head across three interrupted evenings, so everything gets broken into small, completable chunks. My rule became: every session ends with something committed and the app in a runnable state. No half-finished migrations sitting overnight.</p>

<p>Early versions were manual entry only. Add your debts, pick snowball or avalanche, watch the payoff date move as you throw extra money at balances. It worked, and a small number of people used it.</p>

<p>The bigger swings came later:</p>

<p>Plaid bank sync (v3). This was the feature I was most scared of and it turned out to be one of the smoother integrations. Plaid's React Native SDK is solid, and Supabase edge functions made a clean home for the token exchange and webhook handling. The gotcha nobody warns you about: handling the messy middle states, like when a user's bank connection degrades and you need to prompt a re-link without nagging them into uninstalling.</p>

<p>Toffee Coach (v3/v4). An AI coach powered by Claude Haiku that looks at your debts and progress and gives short, encouraging, specific guidance. Haiku was the right model choice for a bootstrapped app: fast, cheap, and more than smart enough for structured coaching prompts. The real work wasn't the API call, it was prompt design that keeps the coach encouraging without letting it drift into financial advice territory it shouldn't give.</p>

<p>RevenueCat paywall restructuring. My first paywall was, in retrospect, a ransom note. I restructured the offering around a cleaner free tier with the premium features (bank sync, Coach, advanced projections) behind the subscription. RevenueCat made the experimentation side painless, which matters when you only have an hour a night to iterate.</p>

<p>The night PostHog ruined me (and saved the app)</p>

<p>Here's the part I'd tattoo on the inside of every indie hacker's eyelids if I could.</p>

<p>After a round of App Store optimization and some Apple Search Ads tests, installs were coming in. But subscriptions weren't. Revenue was flat. I assumed the paywall was the problem and was about to spend weeks redesigning pricing.</p>

<p>Then one night I actually built a proper funnel in PostHog instead of eyeballing event counts.</p>

<p>133 people had started onboarding. One person had completed it.</p>

<p>One.</p>

<p>Not a conversion problem. Not a pricing problem. A "your front door is bricked over" problem. All the ASO work, all the ad spend, all of it was pouring users into an onboarding flow that was quietly executing them somewhere around step three.</p>

<p>The flow was too long, asked for too much too early (including the bank connection before the user had any reason to trust the app), and had a couple of screens where the primary action wasn't obvious. Death by a thousand reasonable-seeming decisions.</p>

<p>The fix took a few weeks of evenings:</p>

<p>Cut onboarding to the absolute minimum. Get the user to their first "aha" (seeing a payoff date) as fast as possible.<br>
Moved Plaid sync out of onboarding entirely. Manual entry first, bank sync offered later once the app has earned some trust.<br>
Instrumented every single step so I'd never fly blind again.</p>

<p>Completion rates went from effectively zero to healthy, and everything downstream (trials, subscriptions, reviews) improved because people were actually reaching the product.</p>

<p>The lesson: instrument your funnel before you spend a dollar on acquisition. I did it backwards and paid the tuition.</p>

<p>Distribution: the unglamorous grind</p>

<p>A few things that moved the needle, and a few that didn't:</p>

<p>ASO metadata overhaul: moved the needle. Rewriting the title, subtitle, and keyword field around what people actually search for beat any single feature launch for install volume.<br>
Apple Search Ads: useful as a lab, expensive as a channel. The best thing ads gave me wasn't installs, it was keyword data I fed back into ASO.<br>
Google Play launch: worth it, eventually. Expo made the port nearly free technically. The Play Store is a different beast for discovery, though.<br>
Content: a long game. Daily short-form video content around debt payoff topics under the Toffee brand. Slow compounding, not a spike.</p>

<p>One thing I'm genuinely proud of: Toffee sits at a 5.0 rating on the App Store. When you fix the funnel so only people who actually experience the product are the ones reviewing it, good things happen.</p>

<p>What I'd tell past me</p>

<p>Instrument first, acquire second. A funnel you can't see is a funnel that's broken.<br>
One hour a night is enough, if every hour ends in a commit. Consistency beats intensity for solo builders.<br>
Don't put your scariest ask (bank credentials!) at the start of the relationship. Trust is sequenced.<br>
Boring stack, boring deploys, exciting product. Save your novelty budget for the user-facing stuff.<br>
AI features earn their keep when they're narrow. Toffee Coach works because it does one job with tight guardrails, not because it's a chatbot bolted to a budget app.</p>

<p>What's next</p>

<p>I've learned a ton about what consumer finance users will and won't pay for, and those lessons are steering where I build next. But Toffee taught me the full loop: build, ship, measure, get humbled, fix, repeat. On one hour a night.</p>

<p>If you're building something in the margins of your day job: it's doable. Just please, set up your funnel analytics before you turn on ads. Learn from my 133.</p>

<p>Want to see the finished product? Toffee is live on both stores:</p>

<p><a href="https://tsecurity.de/weiterlesen/3624136/3652275/133-people-started-my-apps-onboarding-one-finished-heres-everything-i-learned-building-toffee/" target="_blank" rel="noopener noreferrer">Toffee on the App Store</a><br>
<a href="https://tsecurity.de/weiterlesen/3624136/3652275/133-people-started-my-apps-onboarding-one-finished-heres-everything-i-learned-building-toffee/" target="_blank" rel="noopener noreferrer">Toffee on Google Play</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Diesen Prompting-Fehler machen alle! Prompting-Tipp für kreative Aufgaben (Brainstorming etc.)]]></title>
<description><![CDATA[Author: Digitale Profis - Bewertung: 6x - Views:36 Studien & Quellen:
Doshi & Hauser (2024) – Generative AI enhances individual creativity but reduces the collective diversity of novel content
https://www.science.org/doi/10.1126/sciadv.adn5290
Backup/Volltext:
https://pmc.ncbi.nlm.nih.gov/article...]]></description>
<link>https://tsecurity.de/de/3652080/ki-ai-videos/diesen-prompting-fehler-machen-alle-prompting-tipp-fuer-kreative-aufgaben-brainstorming-etc/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3652080/ki-ai-videos/diesen-prompting-fehler-machen-alle-prompting-tipp-fuer-kreative-aufgaben-brainstorming-etc/</guid>
<pubDate>Tue, 07 Jul 2026 18:15:26 +0200</pubDate>
<content:encoded><![CDATA[<p>Author: Digitale Profis - Bewertung: 6x - Views:36 <br/></p><p><iframe id="ytplayer" loading="lazy" type="text/html" width="100%" height="auto" src="https://www.youtube.com/embed/5d3NUnpfSqo?autoplay=1&origin=http://tsecurity.de" frameborder="0"></iframe></p><p>Studien & Quellen:<br />
Doshi & Hauser (2024) – Generative AI enhances individual creativity but reduces the collective diversity of novel content<br />
https://www.science.org/doi/10.1126/sciadv.adn5290<br />
Backup/Volltext:<br />
https://pmc.ncbi.nlm.nih.gov/articles/PMC11244532/<br />
<br />
Moon, Green & Kushlev (2025) – Homogenizing effect of large language models (LLMs) on creative diversity: An empirical comparison of human and ChatGPT writing<br />
https://www.sciencedirect.com/science/article/pii/S294988212500091X<br />
DOI:<br />
https://doi.org/10.1016/j.chbah.2025.100207<br />
<br />
Sourati, Ziabari & Dehghani (2026) – The homogenizing effect of large language models on human expression and thought<br />
https://www.cell.com/trends/cognitive-sciences/fulltext/S1364-6613%2826%2900003-3<br />
DOI:<br />
https://doi.org/10.1016/j.tics.2026.01.003<br />
USC-Artikel dazu:<br />
https://dornsife.usc.edu/news/stories/ai-may-be-making-us-think-and-write-more-alike/<br />
<br />
Haase, Hanel & Pokutta (2025) – Has the Creativity of Large-Language Models peaked? An analysis of inter- and intra-LLM variability<br />
https://arxiv.org/abs/2504.12320<br />
Veröffentlichte Version:<br />
https://www.sciencedirect.com/science/article/pii/S2713374525000202<br />
DOI:<br />
https://doi.org/10.1016/j.yjoc.2025.100113<br />
University-of-Essex-Artikel dazu:<br />
https://www.essex.ac.uk/news/2025/05/07/study-shows-ai-creativity-may-have-peaked<br />
<br />
Peeperkorn, Kouwenhoven, Brown & Jordanous (2024) – Is Temperature the Creativity Parameter of Large Language Models?<br />
https://arxiv.org/abs/2405.00492<br />
PDF:<br />
https://arxiv.org/pdf/2405.00492<br />
DOI:<br />
https://doi.org/10.48550/arXiv.2405.00492<br />
<br />
Kumar, Vincentius, Jordan & Anderson (2024/2025) – Human Creativity in the Age of LLMs: Randomized Experiments on Divergent and Convergent Thinking<br />
https://arxiv.org/abs/2410.03703<br />
PDF:<br />
https://arxiv.org/pdf/2410.03703<br />
DOI:<br />
https://doi.org/10.1145/3706598.3714198<br />
Preprint-DOI:<br />
https://doi.org/10.48550/arXiv.2410.03703<br />
<br />
In diesem Video schauen wir uns eine unbequeme Wahrheit beim Prompting an: Die besten Prompting-Tipps für analytische Aufgaben können kreative Ergebnisse schlechter machen.<br />
Templates, Checklisten und perfekte Prompt-Strukturen helfen bei Code, Datenanalyse, Zusammenfassungen und wiederholbaren Workflows. Aber bei kreativen Aufgaben wie Texten, Kampagnen, Ideenentwicklung oder Storytelling können sie genau das Gegenteil bewirken: weniger Reibung, weniger Originalität, mehr Durchschnitt.<br />
<br />
Wir sprechen über aktuelle Studien zu KI und Kreativität, über das Homogenisierungs-Problem von Large Language Models und darüber, warum „Temperatur hochdrehen“ allein keine echte Kreativität erzeugt. Vor allem aber geht es darum, wie man KI besser nutzt: nicht als Automaten für fertige Ergebnisse, sondern als strategischen Sparringspartner.<br />
<br />
Im Video geht es um:<br />
- Warum KI einzelne kreative Ergebnisse verbessern kann, aber kollektive Vielfalt reduziert.<br />
- Warum standardisierte Prompts kreative Arbeit oft glätten.<br />
- Was „Mid-Level Novelty“ bedeutet.<br />
- Warum LLMs meistens innerhalb der Box kombinieren.<br />
- Warum mehr Zufall nicht automatisch mehr Originalität bedeutet.<br />
- Wie strategisches Briefing, Reibung, gute Grenzen und Iteration bessere Ergebnisse liefern.<br />
- Warum dein eigenes Denken zuerst kommen muss.<br />
<br />
Die zentrale These:<br />
Die KI ist nicht das Problem. Das Problem ist, sie wie einen Automaten zu behandeln, in den man oben eine Checkliste wirft und unten ein Meisterwerk erwartet.<br />
<br />
Werde Kanalmitglied und unterstütze damit unsere Arbeit:<br />
https://www.youtube.com/channel/UCv90NdTyTp7ZPPRvvSZaS5w/join<br />
<br />
Videoinhalt:<br />
00:00 So holst du mit besseren Prompts mehr Kreativität aus KI-Tools heraus<br />
00:36 Was bedeutet die Standardisierung von Prompts?<br />
01:00 Die Studienlage zur Kreativität von KI<br />
02:44 Was ist das Problem bei KI und Kreativität?<br />
04:00 Kann man das über Parameter lösen?<br />
05:48 Vier konkrete Ratschläge für kreativere Outputs<br />
08:34 Gefahr: Durch KI die eigene Kreativität verlieren<br />
09:44 Fazit<br />
<br />
Videovorschläge, Feedback und Kritik kannst Du uns jederzeit in den Kommentaren mitteilen!<br/></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Confusion Matrix — A Sci-Fi Short Story]]></title>
<description><![CDATA[The Confusion Matrix



The system has four categories: A, B, C, D. But a fifth column appeared in the confusion matrix. Nobody added it.


Su Min was the maintenance engineer for the customs intelligent classification system. The system's job was simple: scan every piece of incoming luggage and ...]]></description>
<link>https://tsecurity.de/de/3651264/sichere-programmierung/the-confusion-matrix-a-sci-fi-short-story/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3651264/sichere-programmierung/the-confusion-matrix-a-sci-fi-short-story/</guid>
<pubDate>Tue, 07 Jul 2026 12:58:28 +0200</pubDate>
<content:encoded><![CDATA[<h1>
  
  
  The Confusion Matrix
</h1>

<blockquote>
<p>The system has four categories: A, B, C, D. But a fifth column appeared in the confusion matrix. Nobody added it.</p>
</blockquote>

<p>Su Min was the maintenance engineer for the customs intelligent classification system. The system's job was simple: scan every piece of incoming luggage and classify it as "Routine," "Inspection Required," "Suspicious," or "Prohibited." Classification was based on X-ray images, declaration forms, and passenger risk assessment.</p>

<p>The system had been running for three years with 99.2% accuracy. Su Min's job was mainly handling the 0.8% of misclassifications — baby formula mistaken for chemicals, antique instruments mistaken for weapons, that sort of thing.</p>

<p>The problem appeared on a Monday morning.</p>

<p>While reviewing the weekly report, Su Min found that the confusion matrix — the table showing system predictions versus actual results — had an extra column. A standard four-class confusion matrix should be a 4x4 grid, but now it was 4x5. The extra column had no label, just "Category_5."</p>

<p>Stranger still, the column had data. The previous week, 11 luggage items had been classified into "Category_5," and the actual verified results were also "Category_5." In other words, the system had invented a new category — and its predictions for this category were all correct.</p>

<p>Su Min checked the system logs. Nobody had manually added a fifth category. The classification model's output layer had four fixed nodes corresponding to the four classes. Category_5 should not exist.</p>

<p>She restarted the system. The confusion matrix returned to 4x4.</p>

<p>The next day, Category_5 reappeared. This time with 23 records, 100% accuracy.</p>




<p>Su Min decided to trace back the luggage classified as Category_5.</p>

<p>The 11 items came from different passengers, different flights, different origins. They had no obvious common characteristics — different nationalities, ages, genders, occupations. The declared items also varied: tea, books, electronic accessories, clothing, handicrafts.</p>

<p>Su Min pulled up the X-ray scans for these luggage items.</p>

<p>They all looked normal. No contraband, no abnormal density, no suspicious shapes. The system should have classified them as "Routine."</p>

<p>But it didn't. The system had placed them in a nonexistent category and marked them as "correct."</p>

<p>Su Min decided to open one of the luggage pieces. She chose the third — a suitcase from Bangkok, belonging to a retired teacher, declaring "personal clothing and souvenirs."</p>

<p>The suitcase did contain clothing and souvenirs. But Su Min noticed a detail: among the souvenirs was a small wooden box containing 12 irregularly shaped small stones.</p>

<p>The stones looked ordinary. Grayish-brown, rough surface, varying sizes. But when Su Min picked them up, something felt wrong — the stones were warm. Not warm in the sense of being insulated by the suitcase, but warm as if they generated their own heat, like a living thing.</p>

<p>She sent the stones for analysis. The results came back: the composition was ordinary calcium carbonate and silicon dioxide, no different from common pebbles. But the analyst added a note: "The samples exhibited spontaneous temperature fluctuations of 0.3 degrees Celsius during measurement, at a frequency of approximately once every 4 seconds. Unexplained."</p>

<p>Once every 4 seconds. Su Min remembered something. She went back and checked the other 10 luggage items.</p>

<p>Every single one contained stones. Varying quantities, from 3 to 20. Every stone's temperature fluctuation frequency was once every 4 seconds.</p>




<p>Su Min wrote a report recommending the system be suspended and the source of Category_5 investigated. Her supervisor Fang Ming read the report and was silent for a long time.</p>

<p>"Su Min," he said, "do you know how many luggage items this system has processed in three years?"</p>

<p>"About twelve million."</p>

<p>"If the system starts flagging normal luggage as anomalous — even 'correctly anomalous' — do you know what that means? It means the system's credibility is questioned. Once credibility is questioned, we go back to manual inspection. Twelve million luggage items back to manual inspection — do you know what customs would look like?"</p>

<p>"But the system generated a category that doesn't exist—"</p>

<p>"The accuracy rate for that category is 100%." Fang Ming said. "In data science, 100% accuracy isn't a bug, it's a feature."</p>

<p>Su Min opened her mouth but said nothing. She knew Fang Ming was wrong — 100% accuracy was precisely the most suspicious thing. A four-class model couldn't naturally produce a fifth class, let alone one with perfect prediction accuracy, unless the model had "discovered" some pattern outside its training data.</p>

<p>But Fang Ming didn't care about patterns. He cared about customs not stopping.</p>




<p>Over the next two weeks, Category_5 records continued to increase. Week one: 47. Week two: 89. Week three: 203. The growth was exponential. Every record had 100% accuracy.</p>

<p>Su Min secretly did something. She added a hook to the system that automatically saved the corresponding X-ray scans, declaration forms, and passenger information to her personal server whenever Category_5 was triggered.</p>

<p>By the end of the third week, she had accumulated 339 records. She began analyzing the data.</p>

<p>The passengers had no apparent common characteristics on the surface. But Su Min found a hidden pattern: their travel routes had crossed at certain nodes. Not the same flight, not the same airport — but at some point in the past 12 months, they had all passed through a place called "Port Moresby."</p>

<p>The capital of Papua New Guinea.</p>

<p>339 people had all visited Port Moresby in the past 12 months. This was an extremely low-probability event — Port Moresby was not a tourist destination, and fewer than 2,000 passengers entered China from there annually. The probability of 339 people who had all been there passing through the same customs system in one week was about one in a billion.</p>

<p>Su Min looked up a map of Port Moresby. At the city's edge was a hill called Moresby Ridge. On the hill was an undeveloped limestone cave system.</p>

<p>Stones. Limestone. Calcium carbonate.</p>




<p>Su Min showed Fang Ming her analysis. He looked at it for ten minutes, then closed his office door.</p>

<p>"Su Min," he said, "have you considered another possibility?"</p>

<p>"What possibility?"</p>

<p>"The system didn't discover a new category. The system discovered something new. Something we haven't defined yet."</p>

<p>"You mean—"</p>

<p>"I mean, these stones might actually be something we don't understand. The system didn't know how to classify them, so it created a new category. And the system was right every time — these things are indeed different from ordinary luggage."</p>

<p>Su Min was silent. "Then what do we do?"</p>

<p>Fang Ming looked out the window. Outside the customs building, thousands of passengers were queuing to pass through, each dragging their own luggage, their own stones, their own secrets.</p>

<p>"Nothing," he said. "The system is operating normally. Category_5's accuracy is 100%."</p>

<p>"But—"</p>

<p>"Su Min, some blank cells in a confusion matrix are best left unfilled."</p>




<p>Su Min never checked Category_5 data again after that. She continued handling the 0.8% misclassifications, writing weekly reports, maintaining a four-class system.</p>

<p>But every time she walked through the customs hall, she looked at the passengers' suitcases. Some suitcases seemed heavier than others. Some, when placed on the conveyor belt, emitted an almost inaudible hum.</p>

<p>Once every 4 seconds.</p>




<p><em>This is part of the "Deskless Daily" sci-fi short story series. This is a work of fiction; any resemblance to real persons or organizations is coincidental.</em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[🎮 Building a Top‑Down Action Game with the Limn Engine]]></title>
<description><![CDATA[🎮 Building a Top‑Down Action Game with the Limn Engine


A complete, line‑by‑line tutorial
Live demo: limn-engine-doc.vercel.app/test11.html





  
  
  📖 Introduction


Every great game developer remembers their first "real" project – the moment when code transformed from abstract syntax into s...]]></description>
<link>https://tsecurity.de/de/3649100/sichere-programmierung/building-a-topdown-action-game-with-the-limn-engine/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3649100/sichere-programmierung/building-a-topdown-action-game-with-the-limn-engine/</guid>
<pubDate>Mon, 06 Jul 2026 16:40:02 +0200</pubDate>
<content:encoded><![CDATA[<h1>
  
  
  🎮 Building a Top‑Down Action Game with the Limn Engine
</h1>

<p><strong>A complete, line‑by‑line tutorial</strong><br><br>
<em>Live demo: <a href="https://tsecurity.de/weiterlesen/3620961/3649100/building-a-topdown-action-game-with-the-limn-engine/" target="_blank" rel="noopener noreferrer">limn-engine-doc.vercel.app/test11.html</a></em></p>




<h2>
  
  
  📖 Introduction
</h2>

<p>Every great game developer remembers their first "real" project – the moment when code transformed from abstract syntax into something interactive, something alive on the screen. Yet for many beginners, that milestone remains frustratingly out of reach, buried under complex frameworks, opaque build tools, and thousands of lines of boilerplate.</p>

<p>The <strong>Limn Engine</strong> changes that. Designed from the ground up for accessibility and clarity, it strips away unnecessary complexity and lets you focus on what matters: <strong>building your game</strong>. With just a single JavaScript file and a few lines of code, you can create a fully functional 2D game that runs in any browser.</p>

<p>This tutorial will guide you through every line of <code>test11.html</code> – a complete top‑down action game built with the Limn Engine. You'll learn not just <em>what</em> the code does, but <em>why</em> it works that way. By the end, you'll have a solid understanding of:</p>

<ul>
<li>Setting up the engine and game world
</li>
<li>Designing tile‑based levels
</li>
<li>Implementing player movement, collisions, and AI
</li>
<li>Adding visual effects, UI, and game state management
</li>
<li>Using the engine's powerful features like the camera system, particles, and off‑screen rendering</li>
</ul>

<p>Whether you're a complete beginner taking your first steps or an experienced developer looking for a refreshingly simple tool, this guide will give you the confidence to build your own games with the Limn Engine.</p>

<p>Let's begin.</p>




<h2>
  
  
  📁 1. Project Setup &amp; HTML Structure
</h2>



<div class="highlight js-code-highlight">
<pre class="highlight html"><code><span class="cp">&lt;!doctype html&gt;</span>
<span class="nt">&lt;html&gt;</span>
  <span class="nt">&lt;head&gt;</span>
    <span class="c">&lt;!-- Include the Limn Engine --&gt;</span>
    <span class="nt">&lt;script </span><span class="na">src=</span><span class="s">"epic.js"</span><span class="nt">&gt;&lt;/script&gt;</span>
  <span class="nt">&lt;/head&gt;</span>
  <span class="nt">&lt;body&gt;</span>
  <span class="nt">&lt;script&gt;</span>
    <span class="c1">// All game code goes here</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>
<code>&lt;!doctype html&gt;</code> – Declares this as an HTML5 document.</li>
<li>
<code>&lt;html&gt;</code> – The root element of the page.</li>
<li>
<code>&lt;head&gt;</code> – Contains meta‑information about the page.</li>
<li>
<code>&lt;script src="epic.js"&gt;</code> – Loads the entire Limn Engine into your page. This gives you access to all the classes like <code>Display</code>, <code>Component</code>, <code>Tctxt</code>, <code>ParticleSystem</code>, etc.</li>
<li>
<code>&lt;body&gt;</code> – The visible part of the webpage.</li>
<li>
<code>&lt;script&gt;</code> – This is where we write our game code.</li>
</ul>




<h2>
  
  
  🚀 2. Engine Initialization
</h2>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// Create the main game display and start it</span>
<span class="kd">const</span> <span class="nx">display</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Display</span><span class="p">();</span>
<span class="nx">display</span><span class="p">.</span><span class="nf">perform</span><span class="p">();</span>
<span class="nx">display</span><span class="p">.</span><span class="nf">start</span><span class="p">(</span><span class="mi">800</span><span class="p">,</span> <span class="mi">600</span><span class="p">);</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>
<code>new Display()</code> – Creates the main game window object – your game's "screen".</li>
<li>
<code>display.perform()</code> – A special setup function that prepares the engine to use a more advanced rendering loop.</li>
<li>
<code>display.start(800, 600)</code> – Actually creates the <code>&lt;canvas&gt;</code> element on your webpage and sets its size to 800×600 pixels. The game loop starts running immediately.
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// Set up background image for the fake canvas</span>
<span class="nx">fake</span><span class="p">.</span><span class="nx">bgComm</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Component</span><span class="p">(</span><span class="mi">2000</span><span class="p">,</span><span class="mi">2000</span><span class="p">,</span> <span class="dl">"</span><span class="s2">#1a1a2e</span><span class="dl">"</span><span class="p">,</span> <span class="mi">0</span> <span class="p">,</span><span class="mi">0</span><span class="p">);</span>
<span class="nx">fake</span><span class="p">.</span><span class="nx">bgComm</span><span class="p">.</span><span class="nf">setImage</span><span class="p">(</span><span class="dl">"</span><span class="s2">limn-doc/img/alien.png</span><span class="dl">"</span><span class="p">);</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>
<code>fake.bgComm</code> – The <code>fake</code> object is an off‑screen canvas (a hidden canvas used for rendering static things). <code>.bgComm</code> is a special property for a background component.</li>
<li>
<code>new Component(2000,2000, "#1a1a2e", 0, 0)</code> – Creates a 2000×2000 pixel component at position (0,0). The color <code>"#1a1a2e"</code> is a dark blue‑gray.</li>
<li>
<code>setImage("limn‑doc/img/alien.png")</code> – Changes the component from a coloured rectangle to an image. This loads and displays the alien image as the background.
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// Set the game area size (for culling/performance)</span>
<span class="nx">TCJSgameGameArea</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="mi">1600</span><span class="p">;</span>
<span class="nx">TCJSgameGameArea</span><span class="p">.</span><span class="nx">height</span> <span class="o">=</span> <span class="mi">1200</span><span class="p">;</span>

<span class="c1">// Set the camera's world boundaries</span>
<span class="nx">display</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nx">worldWidth</span> <span class="o">=</span> <span class="mi">1600</span><span class="p">;</span>
<span class="nx">display</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nx">worldHeight</span> <span class="o">=</span> <span class="mi">1200</span><span class="p">;</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>
<code>TCJSgameGameArea.width/height</code> – Sets the size of the "game world". The engine uses this to decide what to draw (culling). If something is outside this area, it might not be rendered, which saves performance.</li>
<li>
<code>display.camera.worldWidth/Height</code> – Tells the camera how big the entire game world is. The camera will never scroll beyond these bounds, keeping the player within the world.
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// Create the particle system</span>
<span class="kd">const</span> <span class="nx">particles</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ParticleSystem</span><span class="p">(</span><span class="nx">display</span><span class="p">);</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>
<code>new ParticleSystem(display)</code> – Creates a new particle manager linked to our main display. We'll use this to create cool effects like explosions and sparkles.</li>
</ul>




<h2>
  
  
  🗺️ 3. Creating the Level (TileMap)
</h2>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// Define the level layout as a 2D array (10 rows x 10 columns)</span>
<span class="nx">fake</span><span class="p">.</span><span class="nx">map</span> <span class="o">=</span> <span class="p">[</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">],</span> <span class="c1">// Row 0</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],</span> <span class="c1">// Row 1</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],</span> <span class="c1">// Row 2</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],</span> <span class="c1">// Row 3</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],</span> <span class="c1">// Row 4</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],</span> <span class="c1">// Row 5</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],</span> <span class="c1">// Row 6</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],</span> <span class="c1">// Row 7</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">],</span> <span class="c1">// Row 8</span>
    <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">1</span><span class="p">]</span>  <span class="c1">// Row 9</span>
<span class="p">];</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>This is a 10×10 grid. Each number represents a tile type:

<ul>
<li>
<code>0</code> – empty space (floor)</li>
<li>
<code>1</code> – wall</li>
<li>
<code>2</code> – coin</li>
</ul>
</li>
<li>This array is the blueprint for your level. The walls form a border and some interior structures, and there are coins placed in the corridors.
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// Define tile size and create tile components</span>
<span class="kd">const</span> <span class="nx">tileW</span> <span class="o">=</span> <span class="mi">40</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">tileH</span> <span class="o">=</span> <span class="mi">40</span><span class="p">;</span>

<span class="nx">fake</span><span class="p">.</span><span class="nx">tile</span> <span class="o">=</span> <span class="p">[</span>
    <span class="k">new</span> <span class="nc">Component</span><span class="p">(</span><span class="nx">tileW</span><span class="p">,</span> <span class="nx">tileH</span><span class="p">,</span> <span class="dl">"</span><span class="s2">#654321</span><span class="dl">"</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="dl">"</span><span class="s2">rect</span><span class="dl">"</span><span class="p">),</span> <span class="c1">// Index 0: Wall tile</span>
    <span class="k">new</span> <span class="nc">Component</span><span class="p">(</span><span class="mi">25</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="dl">"</span><span class="s2">gold</span><span class="dl">"</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="dl">"</span><span class="s2">rect</span><span class="dl">"</span><span class="p">)</span>          <span class="c1">// Index 1: Coin tile</span>
<span class="p">];</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>
<code>tileW</code> and <code>tileH</code> – Set the size of each tile to 40×40 pixels. Since our world is 1600×1200, we have exactly 40 tiles across and 30 tiles down.</li>
<li>
<code>fake.tile</code> – This array holds the visual representation of each tile type.

<ul>
<li>
<code>fake.tile[0]</code> (index 0) is a brown rectangle (<code>#654321</code>) – our wall.</li>
<li>
<code>fake.tile[1]</code> (index 1) is a small gold rectangle – our coin.</li>
</ul>
</li>
<li>
<strong>Important:</strong> The engine automatically adds an empty placeholder at index 0, so our actual tiles start at index 1. This is why we map:

<ul>
<li>Tile ID <code>1</code> → <code>fake.tile[1]</code> (wall)</li>
<li>Tile ID <code>2</code> → <code>fake.tile[2]</code> (coin)
</li>
</ul>
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// Configure and render the tilemap</span>
<span class="nx">fake</span><span class="p">.</span><span class="nx">mapWidth</span> <span class="o">=</span> <span class="mi">1600</span><span class="p">;</span>
<span class="nx">fake</span><span class="p">.</span><span class="nx">mapHeight</span> <span class="o">=</span> <span class="mi">1200</span><span class="p">;</span>
<span class="nx">fake</span><span class="p">.</span><span class="nx">canvas</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="mi">1600</span><span class="p">;</span>
<span class="nx">fake</span><span class="p">.</span><span class="nx">canvas</span><span class="p">.</span><span class="nx">height</span> <span class="o">=</span> <span class="mi">1200</span><span class="p">;</span>
<span class="nx">fake</span><span class="p">.</span><span class="nf">tileMap</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">tilemap</span> <span class="o">=</span> <span class="nx">fake</span><span class="p">.</span><span class="nx">tileFace</span><span class="p">;</span>
<span class="nx">fake</span><span class="p">.</span><span class="nx">tileFace</span><span class="p">.</span><span class="nf">show</span><span class="p">();</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>
<code>fake.mapWidth/Height</code> – Set the size of the tilemap world.</li>
<li>
<code>fake.canvas.width/Height</code> – Resize the off‑screen canvas to match the world size.</li>
<li>
<code>fake.tileMap()</code> – This function reads <code>fake.map</code> and <code>fake.tile</code> and creates the internal tilemap object.</li>
<li>
<code>const tilemap = fake.tileFace</code> – We store a reference to the tilemap so we can use it later for collision detection and coin collection.</li>
<li>
<code>fake.tileFace.show()</code> – This renders all the tiles onto the off‑screen <code>fake</code> canvas. It calculates the position of each tile based on its row/column and draws it. This happens only once, which is very efficient!</li>
</ul>




<h2>
  
  
  🎮 4. Creating Game Objects
</h2>

<h3>
  
  
  Creating the Player
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">player</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Component</span><span class="p">(</span><span class="mi">40</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="dl">"</span><span class="s2">#5b8cff</span><span class="dl">"</span><span class="p">,</span> <span class="mi">700</span><span class="p">,</span> <span class="mi">500</span><span class="p">,</span> <span class="dl">"</span><span class="s2">rect</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">display</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">player</span><span class="p">);</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>
<code>new Component(40, 40, "#5b8cff", 700, 500, "rect")</code> – Creates a new component (game object).

<ul>
<li>
<code>40, 40</code> – width and height in pixels.</li>
<li>
<code>"#5b8cff"</code> – the colour (bright blue).</li>
<li>
<code>700, 500</code> – starting X and Y position.</li>
<li>
<code>"rect"</code> – the type is a rectangle.</li>
</ul>
</li>
<li>
<code>display.add(player)</code> – Adds the player to the main display, so it will be drawn and updated every frame.</li>
</ul>

<h3>
  
  
  Creating Enemies
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">let</span> <span class="nx">enemies</span> <span class="o">=</span> <span class="p">[];</span>
<span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">enemy</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Component</span><span class="p">(</span><span class="mi">35</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="dl">"</span><span class="s2">#ff6b6b</span><span class="dl">"</span><span class="p">,</span> 
        <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">1400</span> <span class="o">+</span> <span class="mi">100</span><span class="p">,</span> 
        <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">1000</span> <span class="o">+</span> <span class="mi">100</span><span class="p">,</span> <span class="dl">"</span><span class="s2">rect</span><span class="dl">"</span><span class="p">);</span>
    <span class="nx">enemy</span><span class="p">.</span><span class="nx">speed</span> <span class="o">=</span> <span class="mi">60</span><span class="p">;</span>
    <span class="nx">display</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">enemy</span><span class="p">);</span>
    <span class="nx">enemies</span><span class="p">.</span><span class="nf">push</span><span class="p">(</span><span class="nx">enemy</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>
<code>let enemies = []</code> – Creates an empty array to store all our enemy objects.</li>
<li>
<code>for (let i = 0; i &lt; 4; i++)</code> – Loops 4 times to create 4 enemies.</li>
<li>
<code>new Component(35, 35, "#ff6b6b", ..., ..., "rect")</code> – Creates a 35×35 pixel red enemy.

<ul>
<li>
<code>Math.random() * 1400 + 100</code> – random X position between 100 and 1500.</li>
<li>
<code>Math.random() * 1000 + 100</code> – random Y position between 100 and 1100.</li>
</ul>
</li>
<li>
<code>enemy.speed = 60</code> – Adds a custom <code>speed</code> property to the enemy. The engine doesn't use this automatically; we'll use it in our <code>update</code> function.</li>
<li>
<code>display.add(enemy)</code> – Adds the enemy to the display.</li>
<li>
<code>enemies.push(enemy)</code> – Stores the enemy in our array so we can update all of them easily.</li>
</ul>

<h3>
  
  
  Creating the UI (Health Bar &amp; Score)
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// Health bar background</span>
<span class="kd">const</span> <span class="nx">healthBarBg</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Component</span><span class="p">(</span><span class="mi">220</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="dl">"</span><span class="s2">#440000</span><span class="dl">"</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="dl">"</span><span class="s2">rect</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">healthBarFill</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Component</span><span class="p">(</span><span class="mi">200</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="dl">"</span><span class="s2">#00ff44</span><span class="dl">"</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">52</span><span class="p">,</span> <span class="dl">"</span><span class="s2">rect</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">display</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">healthBarBg</span><span class="p">);</span>
<span class="nx">display</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">healthBarFill</span><span class="p">);</span>

<span class="c1">// Score text with styling</span>
<span class="kd">const</span> <span class="nx">scoreText</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Tctxt</span><span class="p">(</span><span class="dl">"</span><span class="s2">24px</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Arial</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">#ffffff</span><span class="dl">"</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> 
    <span class="dl">"</span><span class="s2">left</span><span class="dl">"</span><span class="p">,</span> <span class="kc">false</span><span class="p">,</span> <span class="dl">"</span><span class="s2">hanging</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">rgba(0,0,0,0.5)</span><span class="dl">"</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>
<span class="nx">scoreText</span><span class="p">.</span><span class="nf">setText</span><span class="p">(</span><span class="dl">"</span><span class="s2">Score: 0</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">display</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">scoreText</span><span class="p">);</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>
<strong>Health Bar Background (<code>healthBarBg</code>):</strong>

<ul>
<li>
<code>220, 25</code> – 220px wide, 25px tall.</li>
<li>
<code>"#440000"</code> – dark red.</li>
<li>
<code>20, 50</code> – position at (20, 50) from the top‑left corner of the screen.</li>
<li>This creates the "container" for the health bar.</li>
</ul>
</li>
<li>
<strong>Health Bar Fill (<code>healthBarFill</code>):</strong>

<ul>
<li>
<code>200, 20</code> – slightly smaller to fit inside the background.</li>
<li>
<code>"#00ff44"</code> – bright green.</li>
<li>
<code>30, 52</code> – positioned slightly inside the background bar.</li>
<li>This bar will change width to represent health.</li>
</ul>
</li>
<li>
<strong>Score Text (<code>scoreText</code>):</strong>

<ul>
<li>
<code>new Tctxt(...)</code> – <code>Tctxt</code> is a special text component with more features.</li>
<li>
<code>"24px", "Arial", "#ffffff"</code> – font size, family, colour.</li>
<li>
<code>20, 100</code> – position.</li>
<li>
<code>"left"</code> – alignment.</li>
<li>
<code>false</code> – no stroke/outline.</li>
<li>
<code>"hanging"</code> – text baseline.</li>
<li>
<code>"rgba(0,0,0,0.5)"</code> – semi‑transparent black background.</li>
<li>
<code>10, 5</code> – padding around the text.</li>
<li>
<code>scoreText.setText("Score: 0")</code> – sets the initial text.</li>
<li>
<code>display.add(scoreText)</code> – adds it to the display.</li>
</ul>
</li>
</ul>




<h2>
  
  
  🎯 5. Game State &amp; Helper Functions
</h2>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">let</span> <span class="nx">score</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">health</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">invincibleTimer</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">gameActive</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>
<code>score</code> – tracks the player's points.</li>
<li>
<code>health</code> – starts at 100. When it reaches 0, the game is over.</li>
<li>
<code>invincibleTimer</code> – counts down to make the player briefly invincible after being hit.</li>
<li>
<code>gameActive</code> – a boolean that stops the game logic when <code>false</code>.
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">function</span> <span class="nf">applyKnockback</span><span class="p">(</span><span class="nx">target</span><span class="p">,</span> <span class="nx">fromX</span><span class="p">,</span> <span class="nx">fromY</span><span class="p">,</span> <span class="nx">strength</span> <span class="o">=</span> <span class="mi">150</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">angle</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">atan2</span><span class="p">(</span><span class="nx">target</span><span class="p">.</span><span class="nx">y</span> <span class="o">-</span> <span class="nx">fromY</span><span class="p">,</span> <span class="nx">target</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">fromX</span><span class="p">);</span>
    <span class="nx">target</span><span class="p">.</span><span class="nx">speedX</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">cos</span><span class="p">(</span><span class="nx">angle</span><span class="p">)</span> <span class="o">*</span> <span class="nx">strength</span><span class="p">;</span>
    <span class="nx">target</span><span class="p">.</span><span class="nx">speedY</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="nx">angle</span><span class="p">)</span> <span class="o">*</span> <span class="nx">strength</span><span class="p">;</span>
    <span class="nx">target</span><span class="p">.</span><span class="nx">physics</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
    <span class="nf">setTimeout</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
        <span class="nx">target</span><span class="p">.</span><span class="nx">speedX</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="nx">target</span><span class="p">.</span><span class="nx">speedY</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="nx">target</span><span class="p">.</span><span class="nx">physics</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
    <span class="p">},</span> <span class="mi">200</span><span class="p">);</span>
<span class="p">}</span>
</code></pre>

</div>



<p><strong>What this does:</strong></p>

<ul>
<li>This function is called when the player is hit.</li>
<li>
<code>Math.atan2(target.y - fromY, target.x - fromX)</code> – calculates the angle from the enemy to the player.</li>
<li>
<code>target.speedX/Y = Math.cos/Sin(angle) * strength</code> – sets the player's speed in the direction away from the enemy (knockback).</li>
<li>
<code>target.physics = true</code> – enables physics for the player so the speed will actually move them.</li>
<li>
<code>setTimeout(...)</code> – after 200 milliseconds, stops the player's movement by setting speed back to 0 and disabling physics.</li>
</ul>




<h2>
  
  
  🔄 6. The Main Game Loop (<code>update</code> function)
</h2>

<p>This function runs every frame (≈60 times per second). It's the heart of your game.</p>

<h3>
  
  
  📌 Section 1 – Initial Checks
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">function</span> <span class="nf">update</span><span class="p">(</span><span class="nx">dt</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">gameActive</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>
<code>function update(dt)</code> – the engine calls this every frame and passes <code>dt</code> (delta time in seconds). Using <code>dt</code> makes movement consistent regardless of framerate.</li>
<li>
<code>if (!gameActive) return</code> – if the game is over, it exits immediately, freezing all game logic.
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>    <span class="c1">// Make camera follow the player</span>
    <span class="nx">display</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nf">follow</span><span class="p">(</span><span class="nx">player</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>Centers the camera on the player with smooth (interpolated) movement.
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>    <span class="c1">// Keep UI elements fixed on screen</span>
    <span class="nx">healthBarBg</span><span class="p">.</span><span class="nf">fixed</span><span class="p">();</span>
    <span class="nx">healthBarFill</span><span class="p">.</span><span class="nf">fixed</span><span class="p">();</span>
    <span class="nx">scoreText</span><span class="p">.</span><span class="nf">fixed</span><span class="p">();</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>
<code>.fixed()</code> – a special method for UI components. Normally components move with the camera; <code>.fixed()</code> pins them to the screen so they stay in the corner even when the camera moves.
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>    <span class="c1">// Update particle effects</span>
    <span class="nx">particles</span><span class="p">.</span><span class="nf">update</span><span class="p">();</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>Updates all particles (moves them, fades them, removes dead ones). Must be called every frame.</li>
</ul>

<h3>
  
  
  📌 Section 2 – Player Invincibility
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>    <span class="k">if </span><span class="p">(</span><span class="nx">invincibleTimer</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">invincibleTimer</span> <span class="o">-=</span> <span class="nx">dt</span><span class="p">;</span>
        <span class="nx">player</span><span class="p">.</span><span class="nx">alpha</span> <span class="o">=</span> <span class="mf">0.5</span><span class="p">;</span>  <span class="c1">// Make player semi-transparent (blink)</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="nx">player</span><span class="p">.</span><span class="nx">alpha</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>    <span class="c1">// Fully opaque</span>
    <span class="p">}</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>Counts down <code>invincibleTimer</code> using <code>dt</code>.</li>
<li>
<code>player.alpha = 0.5</code> – makes the player 50% transparent (blink effect). When timer reaches 0, the player becomes fully opaque.</li>
</ul>

<h3>
  
  
  📌 Section 3 – Player Movement
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>    <span class="c1">// Read keyboard input</span>
    <span class="kd">let</span> <span class="nx">mx</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">my</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">if </span><span class="p">(</span><span class="nx">display</span><span class="p">.</span><span class="nx">keys</span><span class="p">[</span><span class="mi">37</span><span class="p">])</span> <span class="nx">mx</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="c1">// Left arrow</span>
    <span class="k">if </span><span class="p">(</span><span class="nx">display</span><span class="p">.</span><span class="nx">keys</span><span class="p">[</span><span class="mi">39</span><span class="p">])</span> <span class="nx">mx</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>  <span class="c1">// Right arrow</span>
    <span class="k">if </span><span class="p">(</span><span class="nx">display</span><span class="p">.</span><span class="nx">keys</span><span class="p">[</span><span class="mi">38</span><span class="p">])</span> <span class="nx">my</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="c1">// Up arrow</span>
    <span class="k">if </span><span class="p">(</span><span class="nx">display</span><span class="p">.</span><span class="nx">keys</span><span class="p">[</span><span class="mi">40</span><span class="p">])</span> <span class="nx">my</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>  <span class="c1">// Down arrow</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>
<code>display.keys</code> – an array where the engine stores which keys are currently pressed (keycodes 37‑40 for arrow keys).</li>
<li>If a key is pressed, we set <code>mx</code> or <code>my</code> to 1 or -1 (direction).
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>    <span class="c1">// Normalize diagonal movement</span>
    <span class="k">if </span><span class="p">(</span><span class="nx">mx</span> <span class="o">!==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="nx">my</span> <span class="o">!==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="nx">mx</span> <span class="o">*=</span> <span class="mf">0.707</span><span class="p">;</span>
        <span class="nx">my</span> <span class="o">*=</span> <span class="mf">0.707</span><span class="p">;</span>
    <span class="p">}</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>Prevents faster diagonal movement by multiplying both components by <code>0.707</code> (≈1/√2). This keeps the movement vector length at 1, so the player moves at the same speed in all directions.
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>    <span class="c1">// Apply movement</span>
    <span class="nx">player</span><span class="p">.</span><span class="nx">x</span> <span class="o">+=</span> <span class="nx">mx</span> <span class="o">*</span> <span class="mi">200</span> <span class="o">*</span> <span class="nx">dt</span><span class="p">;</span>
    <span class="nx">player</span><span class="p">.</span><span class="nx">y</span> <span class="o">+=</span> <span class="nx">my</span> <span class="o">*</span> <span class="mi">200</span> <span class="o">*</span> <span class="nx">dt</span><span class="p">;</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>Moves the player by <code>mx</code> (or <code>my</code>) times speed (200 px/s) times <code>dt</code>. This makes movement framerate‑independent.</li>
</ul>

<h3>
  
  
  📌 Section 4 – Wall Collision
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>    <span class="k">if </span><span class="p">(</span><span class="nx">tilemap</span><span class="p">.</span><span class="nf">crashWith</span><span class="p">(</span><span class="nx">player</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="p">{</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">mx</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="nx">player</span><span class="p">.</span><span class="nx">x</span> <span class="o">-=</span> <span class="mi">10</span><span class="p">;</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">mx</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="nx">player</span><span class="p">.</span><span class="nx">x</span> <span class="o">+=</span> <span class="mi">10</span><span class="p">;</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">my</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="nx">player</span><span class="p">.</span><span class="nx">y</span> <span class="o">-=</span> <span class="mi">10</span><span class="p">;</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">my</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="nx">player</span><span class="p">.</span><span class="nx">y</span> <span class="o">+=</span> <span class="mi">10</span><span class="p">;</span>
    <span class="p">}</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>
<code>tilemap.crashWith(player, 1)</code> – checks if the player collides with any tile that has ID <code>1</code> (walls).</li>
<li>If collision occurs, we "push" the player back by 10 pixels in the opposite direction of movement – a simple way to prevent walking through walls.</li>
</ul>

<h3>
  
  
  📌 Section 5 – Coin Collection
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>    <span class="kd">const</span> <span class="nx">coins</span> <span class="o">=</span> <span class="nx">tilemap</span><span class="p">.</span><span class="nf">tiles</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>
    <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">coin</span> <span class="k">of</span> <span class="nx">coins</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">player</span><span class="p">.</span><span class="nf">crashWith</span><span class="p">(</span><span class="nx">coin</span><span class="p">))</span> <span class="p">{</span>
            <span class="nx">tilemap</span><span class="p">.</span><span class="nf">remove</span><span class="p">(</span><span class="nx">coin</span><span class="p">.</span><span class="nx">tx</span><span class="p">,</span> <span class="nx">coin</span><span class="p">.</span><span class="nx">ty</span><span class="p">);</span>
            <span class="nx">score</span> <span class="o">+=</span> <span class="mi">10</span><span class="p">;</span>
            <span class="nx">scoreText</span><span class="p">.</span><span class="nf">setText</span><span class="p">(</span><span class="dl">"</span><span class="s2">Score: </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">score</span><span class="p">);</span>
            <span class="nx">move</span><span class="p">.</span><span class="nx">particles</span><span class="p">.</span><span class="nf">sparkle</span><span class="p">(</span><span class="nx">particles</span><span class="p">,</span> <span class="nx">coin</span><span class="p">.</span><span class="nx">x</span> <span class="o">+</span> <span class="nx">coin</span><span class="p">.</span><span class="nx">width</span><span class="o">/</span><span class="mi">2</span><span class="p">,</span> <span class="nx">coin</span><span class="p">.</span><span class="nx">y</span> <span class="o">+</span> <span class="nx">coin</span><span class="p">.</span><span class="nx">height</span><span class="o">/</span><span class="mi">2</span><span class="p">);</span>
            <span class="nx">display</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nf">shake</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>
<code>tilemap.tiles(2)</code> – gets all tile objects with ID <code>2</code> (coins).</li>
<li>Loops through all coins, checks overlap with player.</li>
<li>
<code>tilemap.remove(coin.tx, coin.ty)</code> – removes the coin.</li>
<li>
<code>score += 10</code> – adds 10 points.</li>
<li>
<code>scoreText.setText(...)</code> – updates the display.</li>
<li>
<code>move.particles.sparkle(...)</code> – creates a sparkle effect at the coin's center.</li>
<li>
<code>display.camera.shake(2, 2)</code> – shakes the camera slightly.</li>
</ul>

<h3>
  
  
  📌 Section 6 – Enemy AI &amp; Collisions
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>    <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">enemies</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="kd">const</span> <span class="nx">enemy</span> <span class="o">=</span> <span class="nx">enemies</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>Uses a standard <code>for</code> loop (not <code>for...of</code>) because we may need to remove enemies from the array while iterating.
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>        <span class="c1">// Enemy chases player using normalized direction</span>
        <span class="kd">let</span> <span class="nx">dx</span> <span class="o">=</span> <span class="nx">player</span><span class="p">.</span><span class="nx">x</span> <span class="o">-</span> <span class="nx">enemy</span><span class="p">.</span><span class="nx">x</span><span class="p">;</span>
        <span class="kd">let</span> <span class="nx">dy</span> <span class="o">=</span> <span class="nx">player</span><span class="p">.</span><span class="nx">y</span> <span class="o">-</span> <span class="nx">enemy</span><span class="p">.</span><span class="nx">y</span><span class="p">;</span>
        <span class="kd">const</span> <span class="nx">distance</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">(</span><span class="nx">dx</span> <span class="o">*</span> <span class="nx">dx</span> <span class="o">+</span> <span class="nx">dy</span> <span class="o">*</span> <span class="nx">dy</span><span class="p">);</span>

        <span class="k">if </span><span class="p">(</span><span class="nx">distance</span> <span class="o">&gt;</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">enemy</span><span class="p">.</span><span class="nx">x</span> <span class="o">+=</span> <span class="p">(</span><span class="nx">dx</span> <span class="o">/</span> <span class="nx">distance</span><span class="p">)</span> <span class="o">*</span> <span class="nx">enemy</span><span class="p">.</span><span class="nx">speed</span> <span class="o">*</span> <span class="nx">dt</span><span class="p">;</span>
            <span class="nx">enemy</span><span class="p">.</span><span class="nx">y</span> <span class="o">+=</span> <span class="p">(</span><span class="nx">dy</span> <span class="o">/</span> <span class="nx">distance</span><span class="p">)</span> <span class="o">*</span> <span class="nx">enemy</span><span class="p">.</span><span class="nx">speed</span> <span class="o">*</span> <span class="nx">dt</span><span class="p">;</span>
        <span class="p">}</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>
<code>dx</code> and <code>dy</code> – distance vector from enemy to player.</li>
<li>
<code>distance</code> – straight‑line distance (Pythagoras).</li>
<li>The <code>if (distance &gt; 5)</code> check prevents jitter when the enemy is already on top of the player.</li>
<li>
<code>(dx / distance)</code> and <code>(dy / distance)</code> – <strong>normalised direction vector</strong> (length = 1). Multiplying by <code>enemy.speed * dt</code> gives consistent speed in any direction – this solves the "diagonal speed boost" problem.
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>        <span class="c1">// Enemy hits player (and player is not invincible)</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">player</span><span class="p">.</span><span class="nf">crashWith</span><span class="p">(</span><span class="nx">enemy</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="nx">invincibleTimer</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
            <span class="nx">health</span> <span class="o">-=</span> <span class="mi">15</span><span class="p">;</span>
            <span class="kd">const</span> <span class="nx">healthPercent</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">health</span> <span class="o">/</span> <span class="mi">100</span><span class="p">);</span>
            <span class="nx">healthBarFill</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="mi">200</span> <span class="o">*</span> <span class="nx">healthPercent</span><span class="p">;</span>

            <span class="nf">applyKnockback</span><span class="p">(</span><span class="nx">player</span><span class="p">,</span> <span class="nx">enemy</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">enemy</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="mi">200</span><span class="p">);</span>
            <span class="nx">display</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nf">shake</span><span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mi">6</span><span class="p">);</span>
            <span class="nx">move</span><span class="p">.</span><span class="nx">particles</span><span class="p">.</span><span class="nf">blood</span><span class="p">(</span><span class="nx">particles</span><span class="p">,</span> <span class="nx">player</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">player</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
            <span class="nx">invincibleTimer</span> <span class="o">=</span> <span class="mf">1.0</span><span class="p">;</span>

            <span class="k">if </span><span class="p">(</span><span class="nx">health</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
                <span class="nx">gameActive</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
                <span class="kd">const</span> <span class="nx">gameOverText</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Tctxt</span><span class="p">(</span><span class="dl">"</span><span class="s2">48px</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Arial</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">#ff0000</span><span class="dl">"</span><span class="p">,</span> 
                    <span class="mi">400</span> <span class="o">+</span> <span class="nx">display</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="mi">300</span> <span class="o">+</span> <span class="nx">display</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="dl">"</span><span class="s2">center</span><span class="dl">"</span><span class="p">);</span>
                <span class="nx">gameOverText</span><span class="p">.</span><span class="nf">setText</span><span class="p">(</span><span class="dl">"</span><span class="s2">GAME OVER - Score: </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">score</span><span class="p">);</span>
                <span class="nx">display</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nx">gameOverText</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>If player touches an enemy and is not invincible:

<ul>
<li>
<code>health -= 15</code> – reduces health.</li>
<li>
<code>healthPercent</code> – health as a decimal (0.0‑1.0).</li>
<li>
<code>healthBarFill.width = 200 * healthPercent</code> – shrinks the green fill.</li>
<li>
<code>applyKnockback(...)</code> – pushes player away.</li>
<li>
<code>display.camera.shake(6, 6)</code> – bigger shake.</li>
<li>
<code>move.particles.blood(...)</code> – blood particle effect.</li>
<li>
<code>invincibleTimer = 1.0</code> – 1 second of invincibility.</li>
<li>If health ≤ 0:</li>
<li>
<code>gameActive = false</code> – stops the loop.</li>
<li>Creates a new <code>Tctxt</code> for the game‑over message, centered on screen, and adds it.
</li>
</ul>
</li>
</ul>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>        <span class="c1">// Click to defeat enemy</span>
        <span class="k">if </span><span class="p">(</span><span class="nx">mouse</span><span class="p">.</span><span class="nx">down</span> <span class="o">&amp;&amp;</span> <span class="nx">enemy</span><span class="p">.</span><span class="nf">clicked</span><span class="p">())</span> <span class="p">{</span>
            <span class="nx">move</span><span class="p">.</span><span class="nx">particles</span><span class="p">.</span><span class="nf">explosion</span><span class="p">(</span><span class="nx">particles</span><span class="p">,</span> <span class="nx">enemy</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">enemy</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="mi">20</span><span class="p">);</span>
            <span class="nx">score</span> <span class="o">+=</span> <span class="mi">50</span><span class="p">;</span>
            <span class="nx">scoreText</span><span class="p">.</span><span class="nf">setText</span><span class="p">(</span><span class="dl">"</span><span class="s2">Score: </span><span class="dl">"</span> <span class="o">+</span> <span class="nx">score</span><span class="p">);</span>
            <span class="nx">display</span><span class="p">.</span><span class="nx">camera</span><span class="p">.</span><span class="nf">shake</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
            <span class="nx">enemy</span><span class="p">.</span><span class="nf">hide</span><span class="p">();</span>
            <span class="nx">enemies</span><span class="p">.</span><span class="nf">splice</span><span class="p">(</span><span class="nx">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
            <span class="nx">i</span><span class="o">--</span><span class="p">;</span>
        <span class="p">}</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>
<code>mouse.down</code> – is the mouse button pressed?</li>
<li>
<code>enemy.clicked()</code> – checks if the click occurred inside the enemy's rectangle.</li>
<li>
<code>move.particles.explosion(...)</code> – creates an explosion effect.</li>
<li>
<code>score += 50</code> – bonus points.</li>
<li>
<code>scoreText.setText(...)</code> – updates score.</li>
<li>
<code>display.camera.shake(4, 4)</code> – moderate shake.</li>
<li>
<code>enemy.hide()</code> – makes the enemy disappear (sets <code>update</code> to <code>null</code>).</li>
<li>
<code>enemies.splice(i, 1)</code> – removes the enemy from the array.</li>
<li>
<code>i--</code> – adjusts the loop counter so the next enemy is processed correctly.</li>
</ul>

<h3>
  
  
  📌 Section 7 – Player Boundaries
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code>    <span class="c1">// Keep player inside world boundaries</span>
    <span class="nx">player</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">min</span><span class="p">(</span><span class="mi">1560</span><span class="p">,</span> <span class="nx">player</span><span class="p">.</span><span class="nx">x</span><span class="p">));</span>
    <span class="nx">player</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">min</span><span class="p">(</span><span class="mi">1160</span><span class="p">,</span> <span class="nx">player</span><span class="p">.</span><span class="nx">y</span><span class="p">));</span>
<span class="p">}</span>
</code></pre>

</div>



<p><strong>What this does:</strong>  </p>

<ul>
<li>Clamps the player's X position between 0 and 1560 (world width minus player width).</li>
<li>Clamps Y between 0 and 1160 (world height minus player height).</li>
<li>This ensures the player never leaves the visible world.</li>
</ul>




<h2>
  
  
  ✅ Conclusion
</h2>

<p>You've now built a complete game using the Limn Engine! You've learned how to:</p>

<ul>
<li>Set up the engine and a game world</li>
<li>Create tile‑based levels</li>
<li>Add player movement with keyboard controls</li>
<li>Implement wall collisions</li>
<li>Add coin collection with particle effects</li>
<li>Create enemies with AI that chase the player</li>
<li>Manage player health and invincibility</li>
<li>Build a UI with health bars and score text</li>
<li>Handle game‑over conditions</li>
<li>Use camera shake for game feel</li>
</ul>

<p>The Limn Engine makes all of this possible with clean, readable code. Happy game development! 🎮</p>




<h2>
  
  
  Useful Links
</h2>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Resource</th>
<th>Link</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>GitHub Repository</strong></td>
<td><a href="https://tsecurity.de/weiterlesen/3620961/3649100/building-a-topdown-action-game-with-the-limn-engine/" target="_blank" rel="noopener noreferrer">github.com/terracodes004/limn-engine-doc</a></td>
</tr>
<tr>
<td><strong>Direct Download (epic.js)</strong></td>
<td><a href="https://tsecurity.de/weiterlesen/3620961/3649100/building-a-topdown-action-game-with-the-limn-engine/" target="_blank" rel="noopener noreferrer">github.com/terracodes004/limn-engine-doc/blob/main/asset/epic.js</a></td>
</tr>
<tr>
<td><strong>Complete API Reference</strong></td>
<td><a href="https://tsecurity.de/weiterlesen/3620961/3649100/building-a-topdown-action-game-with-the-limn-engine/" target="_blank" rel="noopener noreferrer">limn-engine-doc.vercel.app/reference.html</a></td>
</tr>
<tr>
<td><strong>Discord Community</strong></td>
<td><a href="https://tsecurity.de/weiterlesen/3620961/3649100/building-a-topdown-action-game-with-the-limn-engine/" target="_blank" rel="noopener noreferrer">discord.gg/ZqnUtTQb8</a></td>
</tr>
</tbody>
</table></div>




<p>If anything is still unclear, just ask – I'm happy to explain any part of the code in more detail!</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[How one line of Unicode turns "Café Déjà Vu!" into a clean URL slug]]></title>
<description><![CDATA[Every blog, shop, and docs site does this quietly: you type a title, and somewhere a function turns it into the tidy string you see in the address bar. "The CSS Box Model, Explained!" becomes /blog/the-css-box-model-explained. That readable tail is called a slug, and building a good one is a dece...]]></description>
<link>https://tsecurity.de/de/3648279/sichere-programmierung/how-one-line-of-unicode-turns-caf-dj-vu-into-a-clean-url-slug/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3648279/sichere-programmierung/how-one-line-of-unicode-turns-caf-dj-vu-into-a-clean-url-slug/</guid>
<pubDate>Mon, 06 Jul 2026 11:14:58 +0200</pubDate>
<content:encoded><![CDATA[<p>Every blog, shop, and docs site does this quietly: you type a title, and somewhere a function turns it into the tidy string you see in the address bar. "The CSS Box Model, Explained!" becomes <code>/blog/the-css-box-model-explained</code>. That readable tail is called a <em>slug</em>, and building a good one is a deceptively nice little engineering problem. I built one that runs entirely in the browser, no libraries, and I want to walk through it because almost every step taught me something.</p>

<p>You can play with the live version here: <a href="https://tsecurity.de/weiterlesen/3620140/3648279/how-one-line-of-unicode-turns-caf-dj-vu-into-a-clean-url-slug/" target="_blank" rel="noopener noreferrer">https://dev48v.infy.uk/solve/day26-slug.html</a></p>

<h2>
  
  
  What a slug actually has to be
</h2>

<p>Three things. Safe: only characters that survive a URL untouched, so no <code>%20</code> or <code>%C3%A9</code> gremlins. Legible: a human and a search engine can read the topic straight from the URL. Stable: once it's published, it's the permanent handle for that page.</p>

<p>The whole job is a short pipeline of string transforms, and the order matters more than any single step.</p>

<h2>
  
  
  Stripping accents is one line (and it feels like cheating)
</h2>

<p>Most of the world's titles carry diacritics: café, naïve, Zürich, Beyoncé. You want <code>café</code> to become <code>cafe</code>, not some encoded mess. The trick is Unicode normalization form NFKD, which decomposes an accented letter into its base letter plus a separate combining mark. <code>é</code> literally becomes <code>e</code> followed by a "combining acute accent" codepoint.</p>

<p>Every combining mark lives in the range <code>U+0300–U+036F</code>, so one regex wipes them all:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">function</span> <span class="nf">stripAccents</span><span class="p">(</span><span class="nx">s</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">s</span><span class="p">.</span><span class="nf">normalize</span><span class="p">(</span><span class="dl">"</span><span class="s2">NFKD</span><span class="dl">"</span><span class="p">).</span><span class="nf">replace</span><span class="p">(</span><span class="sr">/</span><span class="se">[</span><span class="sr">̀-ͯ</span><span class="se">]</span><span class="sr">/g</span><span class="p">,</span> <span class="dl">""</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// "Café Déjà Vu!" -&gt; "Cafe Deja Vu!"</span>
</code></pre>

</div>



<p>That single line is the part that makes a slugifier feel magic. Run it <em>before</em> you lowercase, while the letters are still their original characters.</p>

<h2>
  
  
  The characters NFKD refuses to help with
</h2>

<p>NFKD only works on things that are "a base letter plus an accent." Plenty of characters aren't: the German <code>ß</code>, the ligatures <code>æ</code> and <code>œ</code>, the Nordic <code>ø</code>, and symbols like <code>&amp;</code>. There's no accent to peel off, so they pass straight through.</p>

<p>For those you keep a small, explicit map and apply it first:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">MAP</span> <span class="o">=</span> <span class="p">{</span> <span class="dl">"</span><span class="s2">ß</span><span class="dl">"</span><span class="p">:</span><span class="dl">"</span><span class="s2">ss</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">æ</span><span class="dl">"</span><span class="p">:</span><span class="dl">"</span><span class="s2">ae</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">œ</span><span class="dl">"</span><span class="p">:</span><span class="dl">"</span><span class="s2">oe</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">ø</span><span class="dl">"</span><span class="p">:</span><span class="dl">"</span><span class="s2">o</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">&amp;</span><span class="dl">"</span><span class="p">:</span><span class="dl">"</span><span class="s2">and</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">€</span><span class="dl">"</span><span class="p">:</span><span class="dl">"</span><span class="s2">eur</span><span class="dl">"</span> <span class="p">};</span>
</code></pre>

</div>



<p>Keep this table intentional and short. Real transliteration of whole scripts (Chinese 北京 to <code>beijing</code>, Cyrillic Москва to <code>moskva</code>) needs big per-language dictionaries and is genuinely lossy, so that's where a dedicated library earns its place. My demo just drops what it can't map, so <code>東京 Tokyo 🚀</code> becomes <code>tokyo</code>.</p>

<h2>
  
  
  Lowercase, then collapse everything else
</h2>

<p>URLs are treated as case-insensitive by users and many servers, so <code>Hello-World</code> and <code>hello-world</code> can become two URLs for one page: duplicate content, split ranking, doubled cache. Lowercasing removes the ambiguity.</p>

<p>Then you replace every run of non-alphanumerics with a single separator:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">s</span> <span class="o">=</span> <span class="nx">s</span><span class="p">.</span><span class="nf">toLowerCase</span><span class="p">().</span><span class="nf">replace</span><span class="p">(</span><span class="sr">/</span><span class="se">[^</span><span class="sr">a-z0-9</span><span class="se">]</span><span class="sr">+/g</span><span class="p">,</span> <span class="dl">"</span><span class="s2">-</span><span class="dl">"</span><span class="p">);</span>
<span class="c1">// "cafe deja vu!" -&gt; "cafe-deja-vu-"</span>
</code></pre>

</div>



<p>The <code>+</code> is doing quiet heavy lifting: it collapses <code>"a  &amp;  b"</code> into <code>a-b</code> instead of <code>a---b</code>. Hyphen is the SEO-standard separator because search engines treat it as a word break; underscore is more of a filename and code-identifier thing.</p>

<p>Notice that trailing <code>-</code>? Titles that end in punctuation leave a dangling separator, so you trim both ends:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="nx">s</span> <span class="o">=</span> <span class="nx">s</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sr">/^-+|-+$/g</span><span class="p">,</span> <span class="dl">""</span><span class="p">);</span>   <span class="c1">// "cafe-deja-vu-" -&gt; "cafe-deja-vu"</span>
</code></pre>

</div>



<h2>
  
  
  Two details that separate a toy from a real one
</h2>

<p><strong>Length, cut on a word boundary.</strong> Long slugs are ugly and some systems cap URL length, so I allow a max. But a naive <code>slice(0, max)</code> guillotines words: <code>the-quick-brownish</code> truncates to <code>the-quick-brow</code>. The fix is to slice, then only back up to the last separator if you actually landed inside a word. If the cut fell on a boundary, keep it.</p>

<p><strong>Uniqueness.</strong> Titles aren't unique. Two posts called "Hello World" both want <code>hello-world</code>, but a slug is usually a database key or a route. The standard answer is a numeric suffix: the first keeps <code>hello-world</code>, the next becomes <code>hello-world-2</code>, then <code>-3</code>. You check each candidate against the set of slugs already in use and bump until one is free.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">function</span> <span class="nf">unique</span><span class="p">(</span><span class="nx">base</span><span class="p">,</span> <span class="nx">taken</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">taken</span><span class="p">.</span><span class="nf">has</span><span class="p">(</span><span class="nx">base</span><span class="p">))</span> <span class="k">return</span> <span class="nx">base</span><span class="p">;</span>
  <span class="kd">let</span> <span class="nx">n</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
  <span class="k">while </span><span class="p">(</span><span class="nx">taken</span><span class="p">.</span><span class="nf">has</span><span class="p">(</span><span class="s2">`</span><span class="p">${</span><span class="nx">base</span><span class="p">}</span><span class="s2">-</span><span class="p">${</span><span class="nx">n</span><span class="p">}</span><span class="s2">`</span><span class="p">))</span> <span class="nx">n</span><span class="o">++</span><span class="p">;</span>
  <span class="k">return</span> <span class="s2">`</span><span class="p">${</span><span class="nx">base</span><span class="p">}</span><span class="s2">-</span><span class="p">${</span><span class="nx">n</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>

</div>



<h2>
  
  
  The one rule that isn't code
</h2>

<p>Once a slug is published, links point at it, search engines have indexed it, people have bookmarked it. If someone edits the title and you silently regenerate the slug, every one of those links 404s and you throw away the ranking you earned. So after first publish, freeze the slug, or if you must change it, keep the old one alive with a 301 redirect. Treat the slug as an identifier that merely <em>started</em> life derived from the title, not something that must forever mirror it.</p>

<p>That's the whole thing: normalize, transliterate, lowercase, collapse, trim, cap, dedupe. A pipeline of tiny transforms that quietly makes the web readable. The interactive build, with a live stage-by-stage trace, is here: <a href="https://tsecurity.de/weiterlesen/3620140/3648279/how-one-line-of-unicode-turns-caf-dj-vu-into-a-clean-url-slug/" target="_blank" rel="noopener noreferrer">https://dev48v.infy.uk/solve/day26-slug.html</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Capacitor Energy: How Much Charge a Capacitor Really Stores]]></title>
<description><![CDATA[Press the shutter on a camera with a built-in flash and a capacitor dumps its entire stored charge into a xenon tube in a few thousandths of a second. The battery alone could never deliver that burst — it simply cannot supply current fast enough. The capacitor's job is to collect energy slowly an...]]></description>
<link>https://tsecurity.de/de/3646719/sichere-programmierung/capacitor-energy-how-much-charge-a-capacitor-really-stores/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3646719/sichere-programmierung/capacitor-energy-how-much-charge-a-capacitor-really-stores/</guid>
<pubDate>Sun, 05 Jul 2026 14:42:36 +0200</pubDate>
<content:encoded><![CDATA[<p>Press the shutter on a camera with a built-in flash and a capacitor dumps its entire stored charge into a xenon tube in a few thousandths of a second. The battery alone could never deliver that burst — it simply cannot supply current fast enough. The capacitor's job is to collect energy slowly and release it almost instantly. The same trick powers a defibrillator, fires a spot welder, and keeps a microcontroller alive through a momentary brownout.</p>

<p>Behind all of these is one short equation for the energy a charged capacitor holds. This article explains where that energy lives, how to calculate it, and why the relationship between voltage and stored energy is steeper than most people expect.</p>

<h2>
  
  
  Why this calculation matters
</h2>

<p>A capacitor is, at heart, an energy reservoir. Knowing how much it holds is not an academic exercise — it decides whether a flash circuit delivers enough light, whether a hold-up capacitor can ride out a power dip, and whether a high-voltage bank is safe to touch after the supply is switched off.</p>

<p>That last point matters for safety. Large capacitors in power supplies, motor drives, and photographic equipment can retain a dangerous charge long after the equipment is unplugged. An engineer who can compute stored energy can also estimate how much of a hazard a capacitor presents and how big a bleeder resistor it needs. On the design side, energy storage sets the size of backup capacitors, the firing energy of pulse circuits, and the ripple performance of smoothing capacitors. Get the energy figure wrong and the circuit either underperforms or becomes unsafe.</p>

<h2>
  
  
  The core formula
</h2>

<p>Charging a capacitor means pushing charge onto one plate and pulling it off the other, building up an electric field in the dielectric between them. Every increment of charge has to be moved against the voltage that the already-stored charge has created, so the work accumulates as the capacitor fills. The total work done — the energy now stored in the field — is:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>E = 0.5 * C * V^2
</code></pre>

</div>



<p>Here E is the stored energy in joules, C is the capacitance in farads, and V is the voltage across the capacitor in volts. The factor of one-half appears because the voltage rises linearly from zero to its final value as the capacitor charges, so the average voltage during charging is only half the final voltage.</p>

<p>The amount of charge held on the plates is governed by the defining relation of capacitance:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Q = C * V
</code></pre>

</div>



<p>with Q in coulombs. Combining the two, the energy can equally be written E = 0.5 * Q * V or E = 0.5 * Q^2 / C, whichever form fits the quantities you already know.</p>

<p>The feature worth burning into memory is the square on the voltage. Energy depends on the square of V but only linearly on C. Doubling the capacitance doubles the stored energy; doubling the voltage quadruples it. That is why pulse-power designers reach for higher voltages rather than larger capacitors when they need more energy in a fixed volume — and why a small rise in working voltage can have an outsized effect on a circuit's energy and its hazard.</p>

<h2>
  
  
  A worked example
</h2>

<p>Take a capacitor with capacitance C = 100 microfarad charged to a voltage V = 12 V.</p>

<p><strong>Step 1 — convert to base units.</strong> A microfarad is 1e-6 farad, so C = 100e-6 F = 1e-4 F.</p>

<p><strong>Step 2 — apply the energy formula.</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>E = 0.5 * C * V^2
E = 0.5 * 100e-6 * 12^2
E = 0.5 * 100e-6 * 144
E = 7.2e-3 J
</code></pre>

</div>



<p>So the stored energy is <strong>7.2 millijoules</strong>.</p>

<p><strong>Step 3 — find the charge held.</strong><br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Q = C * V
Q = 100e-6 * 12
Q = 1.2e-3 C
</code></pre>

</div>



<p>The plates carry <strong>1.2 millicoulombs</strong> of charge.</p>

<p><strong>Step 4 — test the voltage sensitivity.</strong> Now suppose the same capacitor is charged to 24 V instead of 12 V. Voltage has doubled, so by the square law the energy should quadruple:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>E = 0.5 * 100e-6 * 24^2
E = 0.5 * 100e-6 * 576
E = 28.8e-3 J
</code></pre>

</div>



<p>The stored energy rises from 7.2 mJ to <strong>28.8 mJ</strong> — four times as much for twice the voltage. This is the square-law relationship in action, and it is the single most useful thing to remember about capacitor energy.</p>

<h2>
  
  
  Common mistakes
</h2>

<p><strong>Dropping the factor of one-half.</strong> A common slip is to write E = C * V^2 and overstate the energy by a factor of two. The half is real: it is the average-voltage factor from the charging process, and it is not optional.</p>

<p><strong>Mixing up energy and charge.</strong> Energy (joules) and charge (coulombs) are different physical quantities answering different questions. Charge tells you how much current flowed in; energy tells you how much work that current can do. A capacitor at low voltage can hold significant charge but little energy.</p>

<p><strong>Forgetting the unit prefixes.</strong> Microfarads, nanofarads, and picofarads differ by factors of a thousand. Substituting 100 instead of 100e-6 for a 100 uF capacitor inflates the answer by a million. Always convert to farads and volts before plugging numbers in.</p>

<p><strong>Assuming the rated voltage is the stored voltage.</strong> A capacitor's marked voltage is a maximum rating, not the voltage it currently holds. Compute energy from the actual operating voltage, which is often well below the rating.</p>

<p><strong>Ignoring real-world losses.</strong> The formula gives the energy stored in an ideal capacitor. Real capacitors have leakage and equivalent series resistance, so not all of that energy reaches the load, and some bleeds away on its own over time. For precise pulse circuits, account for these losses separately.</p>

<h2>
  
  
  Try the interactive NovaSolver calculator
</h2>

<p>Running the arithmetic once is straightforward; seeing how the stored energy, the time constant, and the charging curve respond as you vary capacitance, resistance, and voltage is where the behaviour becomes intuitive. The <a href="https://tsecurity.de/weiterlesen/3618580/3646719/capacitor-energy-how-much-charge-a-capacitor-really-stores/" target="_blank" rel="noopener noreferrer">Capacitor Charge/Discharge &amp; Energy Simulator</a> on NovaSolver lets you set capacitance, series resistance, and supply voltage, then plots the voltage, current, and stored-energy curves while reporting the time constant, the maximum stored energy, and the charge held.</p>

<h2>
  
  
  Related calculators
</h2>

<ul>
<li>
<a href="https://tsecurity.de/weiterlesen/3618580/3646719/capacitor-energy-how-much-charge-a-capacitor-really-stores/" target="_blank" rel="noopener noreferrer">RC Capacitor Charge / Discharge Simulator</a> — a focused view of the charge and discharge transient when you want to study the time constant on its own.</li>
<li>
<a href="https://tsecurity.de/weiterlesen/3618580/3646719/capacitor-energy-how-much-charge-a-capacitor-really-stores/" target="_blank" rel="noopener noreferrer">RLC Circuit Resonance Simulator</a> — to see how a capacitor and an inductor exchange energy back and forth at resonance.</li>
<li>
<a href="https://tsecurity.de/weiterlesen/3618580/3646719/capacitor-energy-how-much-charge-a-capacitor-really-stores/" target="_blank" rel="noopener noreferrer">Inductor &amp; RL Circuit Transient Response</a> — for the inductor's counterpart, where energy is stored in a magnetic field instead of an electric one.</li>
</ul>

<p>You can browse the full set in the <a href="https://tsecurity.de/weiterlesen/3618580/3646719/capacitor-energy-how-much-charge-a-capacitor-really-stores/" target="_blank" rel="noopener noreferrer">electromagnetics tools hub</a>.</p>

<h2>
  
  
  Closing note
</h2>

<p>Capacitor energy is one of the most useful one-line formulas in electronics. The energy lives in the electric field between the plates, it grows with the square of the voltage, and it grows only linearly with capacitance. That asymmetry shapes real design choices: it pushes pulse-power circuits toward higher voltages, it explains why a modest voltage rating change matters so much, and it tells you when a switched-off capacitor is still worth respecting. Compute the energy, check it against your load's demand, and never assume a "discharged" supply is safe until the numbers say so.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Neuroscience of Deep Work: Why Natural Sounds Beat Music for Coding]]></title>
<description><![CDATA[I used to code with Spotify on. Lo-fi beats, instrumental post-rock, ambient electronic — anything without lyrics. The logic seemed solid: music blocks office noise, and lyric-free music doesn"t hijack your language centers.

Then I tried silence. Then rain sounds. My productivity changed dramati...]]></description>
<link>https://tsecurity.de/de/3646361/sichere-programmierung/the-neuroscience-of-deep-work-why-natural-sounds-beat-music-for-coding/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3646361/sichere-programmierung/the-neuroscience-of-deep-work-why-natural-sounds-beat-music-for-coding/</guid>
<pubDate>Sun, 05 Jul 2026 09:09:48 +0200</pubDate>
<content:encoded><![CDATA[<p>I used to code with Spotify on. Lo-fi beats, instrumental post-rock, ambient electronic — anything without lyrics. The logic seemed solid: music blocks office noise, and lyric-free music doesn"t hijack your language centers.</p>

<p>Then I tried silence. Then rain sounds. My productivity changed dramatically.</p>

<p>Here"s the neuroscience behind why natural sounds beat music for deep work — and why most developers get this wrong.</p>

<h2>
  
  
  The Language Processing Problem
</h2>

<p>Your brain processes spoken language in Broca"s area and Wernicke"s area. Here"s the catch: <strong>instrumental music still activates these regions</strong> if you"ve heard the song before. Your brain "plays back" the missing lyrics — a phenomenon called subvocalization.</p>

<p>This is why even lyric-free music can feel distracting after 30 minutes. Your brain is running a background thread decoding imaginary words while you"re trying to read code.</p>

<p>Natural sounds — rain, ocean waves, wind through trees — don"t trigger this. They"re classified as non-linguistic auditory input. Your brain processes them without engaging language centers.</p>

<h2>
  
  
  The 1/f Pattern
</h2>

<p>Pink noise follows a 1/f power spectrum: equal energy per octave. This pattern matches the firing rhythms of neurons in the auditory cortex. It"s not random — it"s mathematically aligned with how your brain already processes sound.</p>

<p>White noise has equal energy per frequency (flat spectrum), which is why it feels harsh. Brown noise has too much low-frequency energy. Pink noise sits in the sweet spot — stimulating enough to mask background noise, natural enough not to pull attention.</p>

<h2>
  
  
  Why Rain Sounds Specifically Work
</h2>

<p>Rain is nature"s pink noise generator. Each raindrop is a random event, but the aggregate creates a statistically uniform sound field. Your brain can"t predict the next drop, but it also can"t ignore the pattern — this creates what neuroscientists call a "passive attention anchor."</p>

<p>A passive anchor means your brain stays mildly engaged without expending cognitive resources. Unlike silence (where your mind wanders) or music (where your mind follows the structure), rain sounds occupy the exact right amount of neural bandwidth.</p>

<h2>
  
  
  My Stack
</h2>

<p>After testing dozens of sound apps, I landed on:</p>

<ul>
<li>
<strong>OneZen</strong> for natural soundscapes (rain, ocean, forest) — the recordings are layered field recordings, not synthetic loops, which matters because real environmental sound has micro-variations that prevent habituation</li>
<li>
<strong>Noise-canceling headphones</strong> (Sony WH-1000XM5) to kill office chatter</li>
<li>
<strong>25-minute Pomodoro sessions</strong> with 5-minute breaks</li>
</ul>

<h2>
  
  
  The Productivity Data
</h2>

<p>I tracked my output for 6 weeks:</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Condition</th>
<th>Tasks Completed/Week</th>
<th>Deep Work Hours</th>
</tr>
</thead>
<tbody>
<tr>
<td>Spotify (lo-fi)</td>
<td>12</td>
<td>14</td>
</tr>
<tr>
<td>Silence</td>
<td>8</td>
<td>10</td>
</tr>
<tr>
<td>Rain sounds (OneZen)</td>
<td>19</td>
<td>22</td>
</tr>
</tbody>
</table></div>

<p>The silence condition was surprisingly bad — my mind kept wandering. The music condition was decent but inconsistent. Rain sounds were the only condition where I could sustain 3+ hour deep work sessions regularly.</p>

<h2>
  
  
  What About Brown Noise?
</h2>

<p>Brown noise (also called red noise) has a steeper frequency falloff. It"s deeper and rumbles more. Some people swear by it for ADHD focus. The mechanism is similar — it provides a passive attention anchor — but the stronger low-frequency component can be fatiguing for long sessions.</p>

<p>I"ve found rain sounds with occasional thunder (which OneZen includes as a variant) gives just enough variation to prevent adaptation without breaking focus.</p>

<h2>
  
  
  The Bigger Point
</h2>

<p>The choice between music and natural sound isn"t about preference. It"s about how your brain allocates attention resources. Music demands more cognitive overhead than most people realize. Natural sounds demand almost none.</p>

<p>For deep work — coding, writing, analysis — subtraction beats addition every time.</p>




<p><em>OneZen is available on the <a href="https://tsecurity.de/weiterlesen/3618222/3646361/the-neuroscience-of-deep-work-why-natural-sounds-beat-music-for-coding/" target="_blank" rel="noopener noreferrer">App Store</a>.</em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Netflix and Apple TV: What to Watch This Sunday Before the New Week Begins]]></title>
<description><![CDATA[Looking for what to watch this Sunday on Netflix and Apple TV? This weekend has a strong mix of mystery, sci-fi, anime, true crime, and dystopian drama, with Netflix adding fresh July titles and Apple TV bringing back Silo Season 3.



Top Picks for Sunday



TitlePlatformRelease DateGenreRuntime...]]></description>
<link>https://tsecurity.de/de/3646091/apple-ios-macos/netflix-and-apple-tv-what-to-watch-this-sunday-before-the-new-week-begins/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3646091/apple-ios-macos/netflix-and-apple-tv-what-to-watch-this-sunday-before-the-new-week-begins/</guid>
<pubDate>Sun, 05 Jul 2026 04:09:01 +0200</pubDate>
<content:encoded><![CDATA[Looking for what to watch this Sunday on Netflix and Apple TV? This weekend has a strong mix of mystery, sci-fi, anime, true crime, and dystopian drama, with Netflix adding fresh July titles and Apple TV bringing back Silo Season 3.



Top Picks for Sunday



TitlePlatformRelease DateGenreRuntime / EpisodesCastSparks of TomorrowNetflixJuly 5, 2026Anime, sci-fi romanceFilmVoice cast varies by regionEnola Holmes 3NetflixJuly 1, 2026Mystery, adventureFilmMillie Bobby Brown, Louis PartridgeWorst Neighbor EverNetflixJuly 1, 2026True crimeSeriesDocumentary formatHuman VaporNetflixJuly 2, 2026Sci-fi thrillerSeriesJapanese-Korean castSilo Season 3Apple TVJuly 3, 2026Dystopian sci-fi10 episodes, weeklyRebecca Ferguson, Common, Tim Robbins, Jessica Henwick, Ashley Zukerman



Where the Stories Are Heading



Sparks of Tomorrow is the fresh Sunday pick on Netflix. The anime is set in a steam-powered version of Kyoto, where two young characters search for hidden secrets inside a mysterious electrical catalog. It looks like a good choice if you want something emotional, stylish, and different this weekend.



Enola Holmes 3 is the bigger Netflix movie option for viewers who want a fun mystery. Enola returns with another case, and the film keeps the focus on adventure, family tension, and smart detective work.



Silo Season 3 is the main Apple TV pick this Sunday. The new season starts after the rebellion and follows Juliette as the silo faces new danger, while the story also moves into the past to explain how this underground world began. Mild spoilers ahead: Season 3 adds a pre-apocalypse timeline with Jessica Henwick and Ashley Zukerman, giving viewers more answers about the origin of the silos.



FAQs



What should I watch this Sunday on Netflix? Watch Sparks of Tomorrow if you want a new Sunday release. You can also pick Enola Holmes 3 for a mystery movie or Worst Neighbor Ever if you prefer true crime.  What is new on Apple TV this weekend? Silo Season 3 premiered on July 3, 2026, with new episodes every Friday through September 4, 2026.  Is Silo Season 3 worth watching? Yes, especially if you like slow-burn sci-fi with mystery, politics, and survival drama. Start from Season 1 if you have not watched the earlier seasons.  What is the best family-friendly pick? Enola Holmes 3 is the easiest weekend pick for a wider audience, especially if you enjoy mystery stories with a lighter tone.  



This Sunday gives viewers enough choice on both Netflix and Apple TV, from anime and mystery to dark sci-fi. What do you plan to watch? Let us know in the comments.]]></content:encoded>
</item>
<item>
<title><![CDATA[SQLite Internals, Postgres 19 Checksums, & PL/CBMBASIC Extension]]></title>
<description><![CDATA[SQLite Internals, Postgres 19 Checksums, & PL/CBMBASIC Extension



  
  
  Today's Highlights


This week, we delve into SQLite's secure deletion and blob updates, explore upcoming data integrity features in PostgreSQL 19, and discover a unique PostgreSQL extension bringing Commodore 64 BASIC to...]]></description>
<link>https://tsecurity.de/de/3645917/sichere-programmierung/sqlite-internals-postgres-19-checksums-plcbmbasic-extension/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3645917/sichere-programmierung/sqlite-internals-postgres-19-checksums-plcbmbasic-extension/</guid>
<pubDate>Sat, 04 Jul 2026 23:57:35 +0200</pubDate>
<content:encoded><![CDATA[<h2>
  
  
  SQLite Internals, Postgres 19 Checksums, &amp; PL/CBMBASIC Extension
</h2>

<h3>
  
  
  Today's Highlights
</h3>

<p>This week, we delve into SQLite's secure deletion and blob updates, explore upcoming data integrity features in PostgreSQL 19, and discover a unique PostgreSQL extension bringing Commodore 64 BASIC to your database. These updates offer insights into database internals, future resilience, and creative extensibility for the SQLite ecosystem.</p>

<h2>
  
  
  Secure Delete and BLOB Updates in SQLite (SQLite Forum)
</h2>

<p>Source: <a href="https://tsecurity.de/weiterlesen/3617778/3645917/sqlite-internals-postgres-19-checksums-plcbmbasic-extension/" target="_blank" rel="noopener noreferrer">https://sqlite.org/forum/info/6f3e886a1149c97e0ede9a243281efb05a043705393ea94437ed7c0556315972</a></p>

<p>This SQLite forum discussion delves into the nuances of secure data deletion and efficient BLOB updates within SQLite databases. Secure deletion is a critical concern for applications handling sensitive data, where simply deleting a row might not zero-out the underlying storage, leaving recoverable remnants. The thread explores methods and implications for ensuring data is truly eradicated when removed, potentially touching on PRAGMA settings or specific file system interactions. Understanding these mechanisms is crucial for developers building secure, embedded applications with SQLite.</p>

<p>The conversation also extends to optimizing updates for BLOB (Binary Large Object) data. Efficiently handling large binary data, such as images or documents, in an embedded database like SQLite requires careful consideration to avoid performance bottlenecks and excessive disk I/O. The discussion likely covers strategies for in-place updates, managing free space, and the internal workings of SQLite's storage engine when dealing with variable-length BLOBs. This insight helps developers make informed decisions on schema design and update patterns for improved application performance and data integrity.</p>

<p>Comment: This thread offers valuable insights into SQLite's low-level data management, essential for anyone needing to implement robust security or optimize BLOB storage.</p>

<h2>
  
  
  PostgreSQL 19 to Feature Checksums For All Data Pages (Planet PostgreSQL)
</h2>

<p>Source: <a href="https://tsecurity.de/weiterlesen/3617778/3645917/sqlite-internals-postgres-19-checksums-plcbmbasic-extension/" target="_blank" rel="noopener noreferrer">https://postgr.es/p/9o5</a></p>

<p>Shaun Thomas's post on Planet PostgreSQL highlights an anticipated and significant data integrity enhancement coming in PostgreSQL 19: the universal enablement of data checksums. Historically, checksums have been an optional feature, chosen during database initialization, to detect corruption at the page level. With Postgres 19, the default will shift towards always-on checksums, a move that significantly bolsters the database's resilience against silent data corruption, which can arise from hardware malfunctions, file system issues, or even cosmic rays. This change reflects an industry-wide push for robust data integrity guarantees as databases become increasingly central to critical operations.</p>

<p>The article likely elaborates on how these checksums function, residing as a small integer fingerprint in the header of every data page. This proactive verification mechanism ensures that when a page is read, its content matches its stored checksum, immediately flagging any discrepancies. While checksums introduce a minor overhead, their benefit in preventing undetected data loss or logical errors far outweighs the cost, especially for high-availability and mission-critical systems. This update empowers administrators and developers with a foundational layer of protection, making PostgreSQL even more trustworthy.</p>

<p>Comment: Always-on checksums in Postgres 19 are a huge win for data integrity, providing essential protection against silent corruption. This is a must-know for planning future PostgreSQL deployments.</p>

<h2>
  
  
  Bring Commodore 64 BASIC to PostgreSQL with PL/CBMBASIC Extension (Planet PostgreSQL)
</h2>

<p>Source: <a href="https://tsecurity.de/weiterlesen/3617778/3645917/sqlite-internals-postgres-19-checksums-plcbmbasic-extension/" target="_blank" rel="noopener noreferrer">https://postgr.es/p/9o1</a></p>

<p>Thom Brown introduces the whimsical yet technically impressive PL/CBMBASIC extension, allowing PostgreSQL users to write stored procedures and functions in Commodore 64 BASIC. This novel extension caters to developers with a nostalgic appreciation for retro computing, while also showcasing the incredible extensibility of PostgreSQL. It demonstrates how procedural languages, typically implemented in more modern or specialized forms like PL/pgSQL or PL/Python, can be adapted to almost any language paradigm, even those from computing's golden age. The ability to load <code>PL/CBMBASIC</code> hints at a fascinating technical challenge in interpreting and executing BASIC code within the PostgreSQL environment.</p>

<p>While perhaps not intended for production-critical applications, PL/CBMBASIC serves as an excellent educational tool and a testament to PostgreSQL's robust foreign language interface. Developers can experiment with writing simple data manipulation routines or custom functions using BASIC syntax, providing a unique blend of historical computing with contemporary database technology. It highlights the freedom and power PostgreSQL offers to integrate diverse programming languages, encouraging creative solutions and deeper understanding of how database extensions are built and interact with the core system. This project is a practical example of how "new extensions" can push boundaries, even if just for fun and learning.</p>

<p>Comment: This C64 BASIC extension is a fantastic example of PostgreSQL's extensibility; definitely a fun weekend project for database enthusiasts to <code>git clone</code> and try out.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[KENSAT: A Home-Built CubeSat Running a TinyLlama LLM in Orbit]]></title>
<description><![CDATA[Edge AI has spent the last few years migrating off the cloud and onto tiny boards sitting on our workbenches. KENSAT pushes that trend to its logical extreme — it puts a language model in low Earth orbit. Built by Ken Chan in his home lab rather than a NASA clean room, this 2U CubeSat is schedule...]]></description>
<link>https://tsecurity.de/de/3644754/sichere-programmierung/kensat-a-home-built-cubesat-running-a-tinyllama-llm-in-orbit/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3644754/sichere-programmierung/kensat-a-home-built-cubesat-running-a-tinyllama-llm-in-orbit/</guid>
<pubDate>Sat, 04 Jul 2026 06:26:10 +0200</pubDate>
<content:encoded><![CDATA[<p>Edge AI has spent the last few years migrating off the cloud and onto tiny boards sitting on our workbenches. KENSAT pushes that trend to its logical extreme — it puts a language model in low Earth orbit. Built by Ken Chan in his home lab rather than a NASA clean room, this 2U CubeSat is scheduled to launch this fall to prove that modern edge AI hardware can operate autonomously in space.</p>

<h3>The build itself</h3>

<p>At the heart of KENSAT is an NVIDIA Jetson Orin Nano running a quantized TinyLlama large language model. Instead of beaming raw sensor data down for Earth-based computers to process, the satellite runs inference directly in orbit and transmits only the finished results. Surrounding that payload is a full spacecraft’s worth of custom electronics: electrical power, radio, and antenna-deployment boards, all coordinated by an always-on flight computer that keeps the whole system healthy.</p>

<h3>Engineering around space</h3>

<p>Space is unforgiving. Power is scarce, there is no air to carry heat away with a fan, and a single crash could leave the payload offline forever. Chan’s answer is aggressive power gating: the flight computer keeps the Jetson fully powered down until a scheduled window, boots it, sends prompts over a UART link, collects the response, then shuts it back off to save battery. Watchdog circuitry recovers from faults, while critical steps like antenna deployment and AI inference run as fault-tolerant state machines that survive brownouts and unexpected resets. Results come home over a custom 437.08 MHz UHF radio using unencrypted AX.25 packets, so amateur operators worldwide can decode the downlink with their own ground stations.</p>

<h3>What to try next</h3>

<p>The entire effort is open source. The GitHub repository carries flight software, Jetson payload code, SDR ground-station utilities, KiCad schematics, PCB layouts, and thermal analysis. You don’t need a rocket to learn from it: pair an RTL-SDR with a homemade antenna and practice receiving real satellite telemetry, or borrow KENSAT’s power-gating and state-machine patterns for any battery-critical build on the ground. For a thesis or capstone team, it is a full-stack blueprint spanning RF, power, embedded firmware, and applied AI in one project.</p>




<p><em>Originally published on <a href="https://tsecurity.de/weiterlesen/3616615/3644754/kensat-a-home-built-cubesat-running-a-tinyllama-llm-in-orbit/" target="_blank" rel="noopener noreferrer">blog.circuit.rocks</a>.</em></p>

<h1>
  
  
  edgeai #tinyml #machinelearning #ai #circuitrocks
</h1>]]></content:encoded>
</item>
<item>
<title><![CDATA[Silo Season 3 Cast Guide: Who Are the New Characters?]]></title>
<description><![CDATA[Silo Season 3 introduces several important new characters as the story expands beyond the underground silos and explores the events that led to their creation. The new cast plays a major role in revealing the mystery behind the world of Silo while continuing Juliette's journey.



Season 3 follow...]]></description>
<link>https://tsecurity.de/de/3644197/apple-ios-macos/silo-season-3-cast-guide-who-are-the-new-characters/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3644197/apple-ios-macos/silo-season-3-cast-guide-who-are-the-new-characters/</guid>
<pubDate>Fri, 03 Jul 2026 20:09:40 +0200</pubDate>
<content:encoded><![CDATA[Silo Season 3 introduces several important new characters as the story expands beyond the underground silos and explores the events that led to their creation. The new cast plays a major role in revealing the mystery behind the world of Silo while continuing Juliette's journey.



Season 3 follows two timelines. One continues the present-day story inside the silos, while the other takes viewers hundreds of years into the past to show how everything began. This shift brings several fresh faces who become central to the overall story.



New Characters in Silo Season 3




Ashley Zukerman as Daniel Keene

A young congressman with a military engineering background.



He starts uncovering secrets connected to the silo project.



Daniel first appeared briefly in the Season 2 finale before becoming a series regular.





Jessica Henwick as Helen Drew

A determined investigative journalist based in Washington, D.C.



She works alongside Daniel as they investigate a growing conspiracy before the apocalypse.



Helen is one of the biggest new additions this season.





Jessica Brown Findlay as Charlotte Keene

Daniel's sister and a former naval aviator.



Her storyline becomes important as the series explores the early events that shaped the future.





Laura Innes as Senator Thurman

A powerful political leader who plays a key role in the events before the silos were built.



Her decisions influence the larger conspiracy revealed in Season 3.





Morven Christie as Anna Thurman

The senator's daughter.



She becomes involved in the political and personal conflicts during the "Before Times" storyline.





Colin Hanks

Colin Hanks joins the cast in a recurring role connected to the pre-apocalypse timeline.



His character gradually becomes part of the expanding mystery surrounding the silos. 





Reed Birney and Matt Craven

Both actors join Season 3 in undisclosed roles.



Their characters are expected to support the flashback storyline and its larger mystery. 






Returning Main Cast



Fans will also see many familiar faces return, including:




Rebecca Ferguson as Juliette Nichols



Common as Robert Sims



Harriet Walter as Martha Walker



Chinaza Uche as Paul Billings



Avi Nash as Lukas Kyle



Steve Zahn as Solo



Shane McRae as Knox



Remmie Milner as Shirley



Alexandria Riley as Camille Sims 




Wrap Up



The new cast gives Silo Season 3 a much larger scope than previous seasons. With fresh characters exploring the origins of the silos and returning favorites dealing with the present-day crisis, the series promises to answer long-standing questions while setting up its already confirmed fourth and final season.]]></content:encoded>
</item>
<item>
<title><![CDATA[7 new movies and TV shows to watch on Netflix, Prime Video, HBO Max, and more this weekend (July 3)]]></title>
<description><![CDATA[From X-Men 97's second season to the return of Millie Bobby Brown's Enola Holmes, here's what's worth watching this weekend.]]></description>
<link>https://tsecurity.de/de/3643747/it-nachrichten/7-new-movies-and-tv-shows-to-watch-on-netflix-prime-video-hbo-max-and-more-this-weekend-july-3/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3643747/it-nachrichten/7-new-movies-and-tv-shows-to-watch-on-netflix-prime-video-hbo-max-and-more-this-weekend-july-3/</guid>
<pubDate>Fri, 03 Jul 2026 16:02:48 +0200</pubDate>
<content:encoded><![CDATA[From X-Men 97's second season to the return of Millie Bobby Brown's Enola Holmes, here's what's worth watching this weekend.]]></content:encoded>
</item>
<item>
<title><![CDATA[External and internal attention: one selective move in two directions]]></title>
<description><![CDATA[External and internal attention are the same selective operation, privileging some content for fuller processing and excluding the rest, applied to two domains. External (perceptual) attention selects among sensory inputs (locations, moments, features, objects); internal attention selects among y...]]></description>
<link>https://tsecurity.de/de/3642238/sichere-programmierung/external-and-internal-attention-one-selective-move-in-two-directions/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3642238/sichere-programmierung/external-and-internal-attention-one-selective-move-in-two-directions/</guid>
<pubDate>Thu, 02 Jul 2026 22:43:06 +0200</pubDate>
<content:encoded><![CDATA[<blockquote>
<p><em>External and internal attention are the same selective operation, privileging some content for fuller processing and excluding the rest, applied to two domains. External (perceptual) attention selects among sensory inputs (locations, moments, features, objects); internal attention selects among your own contents (memories, rules, the response you are readying). The two are not separate faculties but one move that draws a boundary between selected and excluded content, pointed outward at the world or inward at your own thoughts.<br>
Pay attention to a single voice at a loud party and the other voices drop away. You have not turned them off; your ears still receive them. You have drawn a line around one stream and let the rest fall outside it. That line is what attention is: a boundary between what gets selected for full processing and what does not. The part worth noticing is that the same move runs in two directions, outward and inward, and they look like one operation.</em></p>
</blockquote>

<h2>
  
  
  External attention: how the brain selects in the world (Posner's spotlight and biased competition)
</h2>

<p>The well-mapped direction is outward, attention to what the senses deliver. Michael Posner (1980) gave the classic picture, an attentional spotlight that orients to a location and sharpens processing there; a cue that pulls attention to a spot speeds up whatever appears at that spot. Robert Desimone and John Duncan (1995) supplied the mechanism underneath, biased competition: when several things fall on the same patch of visual cortex they compete to drive the neurons, and attention is the bias that tips the competition toward one of them. Both describe the same act at two levels of zoom: Posner the behavior, Desimone and Duncan the neural competition underneath. Attention selects one stream from the perceptual field and draws the boundary that leaves the rest outside.</p>

<h2>
  
  
  Internal attention: selecting among your own thoughts, memories, and rules
</h2>

<p>Attention also turns inward, and this is not a metaphor borrowed from the outward case. Marvin Chun, Julie Golomb, and Nicholas Turk-Browne (2011) organized the field around exactly this split. External attention selects among sensory inputs: locations, moments, features, objects. Internal attention selects among internally generated contents: a memory to hold, a rule to apply, a response to ready, a thought to keep in mind through the next one. The operation is the same, selection of some content for privileged processing and exclusion of the rest, while the material it works over is inside rather than outside.</p>

<p>So the two modes are one move in two directions. Outward, it draws a boundary in the sensory field. Inward, it draws a boundary in the field of one's own generated contents.</p>

<h2>
  
  
  The inward edge, marked speculative
</h2>

<p>There is a far end of the inward mode that I want to set down lightly, as the speculative half of this picture and not as load-bearing. Internal attention can take as its content the system's own ongoing states, attention turned on attention, a short self-directed loop. I am not going to build anything on this here, and in particular I draw no conclusion about self-awareness from it. The cautious version is only that the inward mode admits a setting in which what is selected is the processing itself, and that this would be continuous with ordinary internal attention rather than a separate faculty. How far it goes is left open; the account below rests entirely on the two ordinary modes.</p>

<h2>
  
  
  How to test it: do external and internal attention share one mechanism?
</h2>

<p>Saying the two modes are one move is really two claims, and it helps to keep them apart. One is that they are the same kind of operation. The stronger one, the one worth betting on, is that they draw on the same single pool of resources rather than two separate pools that merely look alike. The same operation could in principle run twice on two private budgets, so a shared budget is an extra commitment, and that is the version this prediction targets.</p>

<p>If outward and inward attention share one budget, they should share more than a name. They should draw on the same limited capacity, lean on the same control machinery, and charge the same toll to cross between them: switching attention from something out in the world to something held in your head should cost about as much as switching within either domain, which is what a single control set would do. The prediction, then, is that loading external attention and loading internal attention interfere through one shared bottleneck.</p>

<p>The honest part: this test refutes much harder than it confirms. If the two turn out fully separable, each able to run at full strength while the other is saturated, then "one move in two directions" is wrong and they are two faculties that happen to share a word. That is a clean kill. But the reverse is murkier. Finding that both lean on the same frontoparietal regions and both hit a capacity ceiling does not by itself pick out this idea, because a rival picture, two genuinely separate faculties that both draw on one general executive resource, predicts the very same overlap. To tell them apart you need a sharper signature than co-location: a single bottleneck where loading one side eats into the other in proportion, the symmetric trade-off you see in dual-task interference, plus the cross-domain switch cost matching within-domain switching. The reach of the claim is settled by whether those specific signatures hold, not by overlap alone.</p>

<h2>
  
  
  Sources
</h2>

<ul>
<li>Posner, M. I. (1980). Orienting of attention. <em>Quarterly Journal of Experimental Psychology</em> 32(1), 3-25.</li>
<li>Desimone, R., &amp; Duncan, J. (1995). Neural mechanisms of selective visual attention. <em>Annual Review of Neuroscience</em> 18, 193-222.</li>
<li>Chun, M. M., Golomb, J. D., &amp; Turk-Browne, N. B. (2011). A taxonomy of external and internal attention. <em>Annual Review of Psychology</em> 62, 73-101.</li>
</ul>]]></content:encoded>
</item>
<item>
<title><![CDATA[Optimize your app performance for the next generation of Android (I/O Connect ‘26)]]></title>
<description><![CDATA[Author: Android Developers - Bewertung: 0x - Views:4 As memory management evolves toward enforced efficiency, learn how we’re partnering with you to maintain a premium experience across the ecosystem. Dan Brown, Ataul Munim, and Alessando Dovis explore the tools available today to optimize your a...]]></description>
<link>https://tsecurity.de/de/3641782/youtube-security-videos/optimize-your-app-performance-for-the-next-generation-of-android-io-connect-26/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3641782/youtube-security-videos/optimize-your-app-performance-for-the-next-generation-of-android-io-connect-26/</guid>
<pubDate>Thu, 02 Jul 2026 18:45:29 +0200</pubDate>
<content:encoded><![CDATA[<p>Author: Android Developers - Bewertung: 0x - Views:4 <br/></p><p><iframe id="ytplayer" loading="lazy" type="text/html" width="100%" height="auto" src="https://www.youtube.com/embed/4BlGtrTeCMU?autoplay=1&origin=http://tsecurity.de" frameborder="0"></iframe></p><p>As memory management evolves toward enforced efficiency, learn how we’re partnering with you to maintain a premium experience across the ecosystem. Dan Brown, Ataul Munim, and Alessando Dovis explore the tools available today to optimize your app’s footprint and prepare for the roadmap of upcoming changes.<br />
<br />
Chapters:<br />
0:00 - Introduction<br />
2:58 - Memory on Android<br />
9:16 - App memory limits in Android 17<br />
10:12 - In-field monitoring and profiling<br />
15:24 - R8 and memory optimization<br />
20:34 - Bitmaps and image management<br />
27:48 - App resilience and Low memory killer daemon<br />
30:24 - Track app kills and handle memory pressure<br />
33:47 - Recap of app optimization techniques<br />
35:06 - Improve startup time with profiles<br />
36:06 - Save UI state with rememberSaveable<br />
37:12 - Session summary<br />
<br />
<br />
Watch more Android sessions from I/O Connect Berlin → GFD IOC Playlist (Link TBD)<br />
Subscribe to Android Developers → https://goo.gle/AndroidDevs <br />
<br />
<br />
#Android #GoogleIOConnect #AndroidApps<br />
<br />
<br />
Event: Google I/O Connect Berlin 2026<br />
<br />
Speakers: Dan Brown, Ataul Munim, Alessando Dovis<br />
Products Mentioned: Android<br/></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Node-RED on Industrial Edge Gateways: Building Simple Factory IoT Data Flows]]></title>
<description><![CDATA[Industrial IoT projects often start with a simple question:
Can we collect this data and send it somewhere useful?
Maybe the data comes from a Modbus device. Maybe it is a machine status signal. Maybe it is a sensor reading that needs to be sent to an MQTT broker or cloud endpoint.
Not every earl...]]></description>
<link>https://tsecurity.de/de/3640619/sichere-programmierung/node-red-on-industrial-edge-gateways-building-simple-factory-iot-data-flows/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3640619/sichere-programmierung/node-red-on-industrial-edge-gateways-building-simple-factory-iot-data-flows/</guid>
<pubDate>Thu, 02 Jul 2026 11:14:15 +0200</pubDate>
<content:encoded><![CDATA[<p>Industrial IoT projects often start with a simple question:<br>
Can we collect this data and send it somewhere useful?<br>
Maybe the data comes from a Modbus device. Maybe it is a machine status signal. Maybe it is a sensor reading that needs to be sent to an MQTT broker or cloud endpoint.<br>
Not every early-stage project needs a full custom application from day one. Sometimes the team first needs a practical way to build, test, and adjust the data flow close to the equipment.<br>
That is where Node-RED becomes interesting.<br>
Node-RED is not an industrial edge gateway. It is a flow-based, low-code tool for connecting data sources, transforming values, applying simple logic, and routing messages to other systems.<br>
When it runs on an industrial edge gateway, Node-RED can become part of the edge-side workflow layer. A gateway such as <strong><a href="https://tsecurity.de/weiterlesen/3612480/3640619/node-red-on-industrial-edge-gateways-building-simple-factory-iot-data-flows/" target="_blank" rel="noopener noreferrer">Robustel EG5120</a></strong> can provide the industrial platform around it: field-side interfaces, local computing resources, network connectivity, security functions, and remote management.<br>
The useful point is not that Node-RED makes every factory “smart.” The useful point is that it can help turn selected field-side data into a working IoT data flow without building everything from scratch.</p>
<h2>
  
  
  Where Node-RED fits in the architecture
</h2>

<p>An industrial edge gateway usually sits between factory-floor equipment and upper-layer systems.<br>
It may connect to:<br>
●PLC-side devices<br>
●meters<br>
●sensors<br>
●machine controllers<br>
●serial equipment<br>
●Ethernet networks<br>
●MQTT brokers<br>
●cloud systems<br>
●APIs or databases<br>
Node-RED fits into this architecture as an application layer running on the gateway. It helps define what happens to selected data after it becomes available at the edge.<br>
A simple view might look like this:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>field device or PLC-side equipment
        ↓
industrial edge gateway
        ↓
Node-RED flow
        ↓
MQTT broker, cloud API, database, or monitoring system
</code></pre>

</div>



<p>The gateway provides the industrial base.<br>
Node-RED helps build the data flow.<br>
That distinction matters. Node-RED does not remove the need for correct wiring, protocol settings, register maps, network design, or security controls. It simply gives teams a flexible way to connect the steps inside a data workflow.</p>
<h2>
  
  
  Why run Node-RED close to factory equipment?
</h2>

<p>Running data flows at the edge can be useful when the data needs some local handling before it moves upstream.<br>
For example, a project may need to:<br>
●read selected Modbus values<br>
●parse serial data<br>
●format raw values into JSON<br>
●add equipment names or timestamps<br>
●filter repeated readings<br>
●trigger a simple alert when a value changes<br>
●publish selected data to MQTT<br>
●send prepared data to an HTTP API or database<br>
These are common factory IoT tasks, especially in brownfield environments.<br>
Older machines, meters, or PLC-side devices may not have a modern cloud connector. But they may expose useful values through Modbus, serial data, Ethernet, digital signals, or added sensors.<br>
Node-RED can help project teams build a bridge between available field-side data and the systems that need visibility.<br>
It is especially useful in proof-of-concept work, pilot projects, and application-specific workflows where the team needs to test whether a data path is practical before committing to a larger software build.</p>
<h2>
  
  
  A simple Modbus-to-MQTT flow
</h2>

<p>One common example is Modbus to MQTT.<br>
A field device may expose values through Modbus RTU or Modbus TCP. The edge gateway provides the physical and network connection. Node-RED can then help read or receive the selected data, transform it, and publish it to an MQTT broker.<br>
A simplified flow may look like this:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Modbus device
        ↓
edge gateway connection
        ↓
Node-RED reads selected values
        ↓
values are scaled, renamed, or formatted
        ↓
message is published to MQTT

</code></pre>

</div>



<p>For example, a raw value from an energy meter may become a structured MQTT message with an equipment ID, measurement name, unit, timestamp, and reading.<br>
A machine status input may become something like:</p>

<p><code>machine_02/status = running<br>
line_01/fault = active</code></p>

<p>This is where Node-RED is useful. It helps move from raw data to readable messages.<br>
But again, the quality of the result depends on the project setup. The Modbus address, register map, polling interval, tag naming, payload format, MQTT topic structure, and security configuration all still need to be designed properly.</p>

<h2>
  
  
  What Node-RED is good for
</h2>

<p>Node-RED is often a good fit for lightweight edge-side data workflows.<br>
It can be useful for:<br>
●Modbus-to-MQTT workflows<br>
●serial-to-JSON parsing<br>
●machine status monitoring<br>
●sensor data forwarding<br>
●simple edge-side filtering<br>
●MQTT, HTTP, API, or database integration<br>
●proof-of-concept validation<br>
●non-safety-critical alerting or notification flows<br>
This is why many industrial IoT teams like it. It gives them a visual way to build and modify data flows without starting from a blank codebase.<br>
But it should not be used without boundaries.<br>
Node-RED should not be treated as a replacement for:<br>
●PLC control logic<br>
●deterministic real-time control<br>
●safety-critical automation functions<br>
●SCADA or MES platforms<br>
●proper cybersecurity architecture<br>
●long-term maintenance planning<br>
The better question is not simply:<br>
Can Node-RED do this?<br>
A better question is:<br>
Is Node-RED the right layer for this workflow, and can the flow be secured, monitored, updated, and maintained properly?<br>
That second question is less exciting, but much more useful in production.</p>

<h2>
  
  
  Where Robustel EG5120 fits
</h2>

<p>In Node-RED-based industrial IoT workflows, Robustel EG5120 fits into the site-side industrial edge gateway layer.<br>
Its role is to provide the platform around the workflow: field-side connectivity, local application support, upstream communication, security functions, and remote gateway management.<br>
For example, it may be relevant when teams need to:<br>
●run Node-RED or other local applications at the edge<br>
●connect supported serial or Ethernet-side equipment<br>
●collect selected machine, sensor, meter, or PLC-side data<br>
●publish prepared data to MQTT brokers or cloud systems<br>
●use cellular connectivity for remote or backup communication<br>
●manage deployed gateways over time<br>
This does not mean EG5120 automatically makes a Node-RED flow production-ready.<br>
The Node-RED logic still depends on the installed nodes, data source, protocol configuration, credentials, network settings, and maintenance process.<br>
The gateway provides the industrial platform. The flow still needs to be designed responsibly.</p>

<h2>
  
  
  Closing thought
</h2>

<p>Node-RED can be valuable on an industrial edge gateway when it is used for the right layer of the architecture.<br>
It is not a replacement for PLCs, SCADA, MES, or safety-critical automation. It is better understood as a flexible workflow tool for collecting, transforming, and routing selected factory-floor data.<br>
For many industrial IoT projects, that is already useful. It can shorten the path from available machine-side data to a working data flow, especially when teams are testing Modbus-to-MQTT, serial parsing, sensor forwarding, or simple cloud integration.<br>
A product such as Robustel EG5120 can support this kind of site-side edge platform for local data flows, secure communication, and remote gateway management. The actual Node-RED workflows still need to be tested, documented, secured, and maintained over time.<br>
For readers who want a concrete product reference, the <a href="https://tsecurity.de/weiterlesen/3612480/3640619/node-red-on-industrial-edge-gateways-building-simple-factory-iot-data-flows/" target="_blank" rel="noopener noreferrer">Robustel EG5120 page</a> gives more detail on its gateway capabilities and deployment options.<br>
If you have used Node-RED in an industrial IoT project, I’d be curious to hear where things usually get tricky first: Modbus setup, serial parsing, MQTT topic design, flow maintenance, security, or scaling beyond the first pilot?</p>

<h2>
  
  
  FAQs
</h2>

<p><strong>Q1: Can Node-RED run on an industrial edge gateway?</strong><br>
Yes, Node-RED can run on an industrial edge gateway when the gateway provides the required software environment, runtime support, and computing resources. In this setup, Node-RED works as an application layer on the gateway, helping teams build data flows close to factory equipment.<br>
<strong>Q2: What is Node-RED used for in industrial IoT?</strong><br>
In industrial IoT, Node-RED is often used for lightweight data flow tasks such as Modbus-to-MQTT workflows, serial data parsing, sensor data forwarding, MQTT publishing, HTTP API integration, and non-safety-critical monitoring logic. It is strongest in data collection, transformation, and routing rather than deterministic machine control.<br>
<strong>Q3: Where does Robustel EG5120 fit in Node-RED edge workflows?</strong><br>
Robustel EG5120 fits into the industrial edge gateway layer. It can provide the site-side platform for running selected edge applications such as Node-RED, connecting supported field-side equipment, forwarding data to MQTT or cloud systems, and managing gateway deployments remotely. The final workflow still depends on project configuration, installed nodes, data sources, security settings, and maintenance planning.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Apple TV July 2026: Every New Show and Movie Coming This Month]]></title>
<description><![CDATA[Apple TV July is packed with new and returning titles, including Silo Season 3, Trying Season 5, Lucky, The Dink, and a new Snoopy special. The July lineup starts on Friday, July 3, and continues through Friday, July 31, with sci-fi, comedy, thriller, sports comedy, and family animation.



Here’...]]></description>
<link>https://tsecurity.de/de/3639408/apple-ios-macos/apple-tv-july-2026-every-new-show-and-movie-coming-this-month/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3639408/apple-ios-macos/apple-tv-july-2026-every-new-show-and-movie-coming-this-month/</guid>
<pubDate>Wed, 01 Jul 2026 20:22:30 +0200</pubDate>
<content:encoded><![CDATA[Apple TV July is packed with new and returning titles, including Silo Season 3, Trying Season 5, Lucky, The Dink, and a new Snoopy special. The July lineup starts on Friday, July 3, and continues through Friday, July 31, with sci-fi, comedy, thriller, sports comedy, and family animation.



Here’s everything coming to Apple TV in July, along with the release date, cast, episode details, and what to expect.



1. Silo Season 3








Episodes: 10 episodes



Start date: July 3, 2026



Finale date: September 4, 2026



Genre: Sci-fi drama



Cast: Rebecca Ferguson, Common, Harriet Walter, Chinaza Uche, Jessica Henwick, Ashley Zukerman




Plot



Season 3 continues Juliette’s story after her forced cleaning, while the silo deals with rebellion and a new danger. The season also goes back to the “Before Times,” where Helen Drew and Daniel Keene uncover a conspiracy that changes everything.



2. Trying Season 5








Episodes: 8 episodes



Start date: July 8, 2026



Finale date: August 26, 2026



Genre: Comedy



Cast: Esther Smith, Rafe Spall, Scarlett Rayner, Cooper Turner, Charlotte Riley




Plot



Nikki and Jason’s family life gets complicated when Princess and Tyler’s biological mother, Kat, arrives at their doorstep. The new season follows the chaos, emotions, and pressure this brings into their home.



3. The Charlie Brown and Snoopy Show



This guide will help you stream "A Charlie Brown Christmas" on Apple TV+. (Photo Credit: Apple.)




Episodes: 18 episodes



Start date: July 10, 2026



Genre: Kids and family animation



Cast: Peanuts characters




Plot



The classic Peanuts series follows Charlie Brown, Snoopy, and the gang through everyday problems, funny moments, and Snoopy’s wild imagination. It brings older Peanuts stories to Apple TV for family viewing.



4. Lucky








Episodes: Limited series



Start date: July 15, 2026



Finale date: August 19, 2026



Genre: Drama, action, thriller



Cast: Anya Taylor-Joy, Annette Bening, Timothy Olyphant, Aunjanue Ellis-Taylor, Drew Starkey




Plot



Lucky follows a con artist who goes on the run after a multimillion-dollar heist goes wrong. With the FBI and a dangerous crime boss chasing her, she has to face her past while trying to survive.



5. The Dink








Duration: Movie



Release date: July 24, 2026



Genre: Comedy, sports



Cast: Jake Johnson, Ed Harris, Mary Steenburgen, Andy Roddick, Patton Oswalt, Chloe Fineman, Ben Stiller




Plot



Dusty Boyd is a washed-up tennis pro who starts playing pickleball after an old injury keeps him away from tennis. What begins as rehab turns into a fight for his father’s approval, his club’s future, and his own identity.



6. Snoopy Presents: There’s No Place Like Home, Snoopy




Duration: Special



Release date: July 31, 2026



Genre: Kids and family



Cast: Riley Vargas, Terry McGurrin, Rob Tinkler, Kitai O’Garro, Josephine Nisbett




Plot



Snoopy is heartbroken after his doghouse is accidentally sold at a yard sale. Charlie Brown tries to help him find it, and their journey turns into a sweet story about what makes a place feel like home.



Final Thoughts



Apple TV July gives viewers a strong mix of returning favorites, new thrillers, comedy, and family-friendly Peanuts titles. In the US, Apple TV costs $12.99 per month after a 7-day free trial.



What do you plan to watch first on Apple TV this July? Let us know in the comments.]]></content:encoded>
</item>
<item>
<title><![CDATA[Anthropic is bringing back Claude Fable 5 globally after US lifts export control order — where can enterprises access it?]]></title>
<description><![CDATA[Anthropic is restoring global access to its most powerful generally released AI model yet, Claude Fable 5, today,  after the U.S. Department of Commerce withdrew emergency export controls that led the company to suspend all access to both Fable 5 and its less restricted cybersecurity counterpart ...]]></description>
<link>https://tsecurity.de/de/3639021/it-nachrichten/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3639021/it-nachrichten/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/</guid>
<pubDate>Wed, 01 Jul 2026 18:03:33 +0200</pubDate>
<content:encoded><![CDATA[<p>Anthropic is <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">restoring global access </a>to its most powerful generally released AI model yet, Claude Fable 5, today,  after the U.S. Department of Commerce withdrew emergency export controls that led the company to <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">suspend all access to both Fable 5 and its less restricted cybersecurity counterpart model Claude Mythos 5</a> last month, just days after both models were initially introduced. </p><p>Starting today, Fable 5 is available for users globally across the primary Anthropic ecosystem, including the Claude Platform, Claude.ai, Claude Code, and Claude Cowork. However, when VentureBeat tried to access it in Claude Code on Terminal, it still showed as disabled.</p><p>For organizations leveraging cloud hyperscalers, Anthropic says it is moving to re-enable access on Amazon Web Services, Google Cloud, and Microsoft Foundry “as quickly as possible.” So far, VentureBeat's research has been unable to confirm if the models have been restored on these external cloud hyperscaler platforms yet.</p><p>Mythos 5 remains a different case. A<a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer"> letter posted on the social network X </a>allegedly from U.S. Commerce Secretary Howard Lutnick to Anthropic executive Tom Brown says a license is no longer required for the export, reexport, or in-country transfer of Fable<i> and Mythos.</i></p><p>But Anthropic’s own <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">redeployment post on its website </a>says only that Mythos 5 access has been restored for “a set of US organizations,” following government approval on June 26. The company says it is continuing to coordinate with the government to expand access to broader domestic and international partners in its opt-in cybersecurity testing program, <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Project Glasswing</a>.</p><p>That leaves Mythos 5 in a middle category: legally cleared from the emergency export-control order, but not generally available. The current limit appears to come from Anthropic’s decision to keep Mythos behind a vetted-access model, with the U.S. government still playing a role in approvals, standards and expansion.</p><p>Posting on X, Commerce Secretary Howard Lutnick <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">said</a> Anthropic and the government had “worked closely” to “analyze and approve Fable 5,” while White House Chief of Staff Susie Wiles also <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">posted</a> on X, framing the decision around U.S. AI leadership and deployment speed.</p><p>Wiles wrote that the United States is the “undisputed winner in the AI race,” adding that the shared priority is to “get the best tech deployed as quickly and safely as possible.”</p><p>The reversal follows concerns from cybersecurity leaders and AI policy experts over the export control order, who argued that the U.S. risked hobbling its own industry while giving Chinese AI labs an opening. Former Facebook security chief Alex Stamos <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">called</a> the Fable restriction a “huge own goal for the US,” warning that security companies could be driven toward Chinese models, while other critics said the so-called "ad hoc" regulatory intervention made dependence on U.S. AI platforms look like a strategic liability.</p><h2><b>Reminder on Claude Fable 5 pricing</b></h2><p>For chief information and technology officers evaluating the return of the model, the deployment comes with distinct structural conditions and significant financial investments.</p><p>Anthropic is pricing both Fable 5 and Mythos 5 at $10.00 per million input tokens and $50.00 per million output tokens, the most expensive of all frontier models globally.</p><table><tbody><tr><td><p><b>Model</b></p></td><td><p><b>Input ($/1M)</b></p></td><td><p><b>Output ($/1M)</b></p></td><td><p><b>Total ($/1M)</b></p></td><td><p><b>Source</b></p></td></tr><tr><td><p>MiMo-V2.5 Flash</p></td><td><p>$0.10</p></td><td><p>$0.30</p></td><td><p>$0.40</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Xiaomi</a></p></td></tr><tr><td><p>deepseek-v4-flash</p></td><td><p>$0.14</p></td><td><p>$0.28</p></td><td><p>$0.42</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">DeepSeek</a></p></td></tr><tr><td><p>deepseek-v4-pro</p></td><td><p>$0.435</p></td><td><p>$0.87</p></td><td><p>$1.305</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">DeepSeek</a></p></td></tr><tr><td><p>MiniMax-M3</p></td><td><p>$0.30</p></td><td><p>$1.20</p></td><td><p>$1.50</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">MiniMax</a></p></td></tr><tr><td><p>LongCat-2.0 — limited-time promo</p></td><td><p>$0.30</p></td><td><p>$1.20</p></td><td><p>$1.50</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">LongCat</a></p></td></tr><tr><td><p>Gemini 3.1 Flash-Lite</p></td><td><p>$0.25</p></td><td><p>$1.50</p></td><td><p>$1.75</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Google</a></p></td></tr><tr><td><p>Qwen3.7-Plus</p></td><td><p>$0.40</p></td><td><p>$1.60</p></td><td><p>$2.00</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Alibaba Cloud</a></p></td></tr><tr><td><p>MiMo-V2.5</p></td><td><p>$0.40</p></td><td><p>$2.00</p></td><td><p>$2.40</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Xiaomi</a></p></td></tr><tr><td><p>LongCat-2.0 — standard</p></td><td><p>$0.75</p></td><td><p>$2.95</p></td><td><p>$3.70</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">LongCat</a></p></td></tr><tr><td><p>Grok 4.3 (low context)</p></td><td><p>$1.25</p></td><td><p>$2.50</p></td><td><p>$3.75</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">xAI</a></p></td></tr><tr><td><p>MiMo-V2.5 Pro (≤256K)</p></td><td><p>$1.00</p></td><td><p>$3.00</p></td><td><p>$4.00</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Xiaomi</a></p></td></tr><tr><td><p>Kimi-K2.6</p></td><td><p>$0.95</p></td><td><p>$4.00</p></td><td><p>$4.95</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Moonshot AI</a></p></td></tr><tr><td><p>GLM-5.2</p></td><td><p>$1.40</p></td><td><p>$4.40</p></td><td><p>$5.80</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Z.ai</a></p></td></tr><tr><td><p>GPT-5.6 Luna</p></td><td><p>$1.00</p></td><td><p>$6.00</p></td><td><p>$7.00</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">OpenAI</a></p></td></tr><tr><td><p>Grok 4.3 (high context)</p></td><td><p>$2.50</p></td><td><p>$5.00</p></td><td><p>$7.50</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">xAI</a></p></td></tr><tr><td><p>MiMo-V2.5 Pro (&gt;256K)</p></td><td><p>$2.00</p></td><td><p>$6.00</p></td><td><p>$8.00</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Xiaomi</a></p></td></tr><tr><td><p>Qwen3.7-Max</p></td><td><p>$2.50</p></td><td><p>$7.50</p></td><td><p>$10.00</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Alibaba Cloud</a></p></td></tr><tr><td><p>Gemini 3.5 Flash</p></td><td><p>$1.50</p></td><td><p>$9.00</p></td><td><p>$10.50</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Google</a></p></td></tr><tr><td><p>Gemini 3.1 Pro Preview (≤200K)</p></td><td><p>$2.00</p></td><td><p>$12.00</p></td><td><p>$14.00</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Google</a></p></td></tr><tr><td><p>GPT-5.6 Terra</p></td><td><p>$2.50</p></td><td><p>$15.00</p></td><td><p>$17.50</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">OpenAI</a></p></td></tr><tr><td><p>GPT-5.4</p></td><td><p>$2.50</p></td><td><p>$15.00</p></td><td><p>$17.50</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">OpenAI</a></p></td></tr><tr><td><p>Gemini 3.1 Pro Preview (&gt;200K)</p></td><td><p>$4.00</p></td><td><p>$18.00</p></td><td><p>$22.00</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Google</a></p></td></tr><tr><td><p>Claude Opus 4.8</p></td><td><p>$5.00</p></td><td><p>$25.00</p></td><td><p>$30.00</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Anthropic</a></p></td></tr><tr><td><p>GPT-5.5</p></td><td><p>$5.00</p></td><td><p>$30.00</p></td><td><p>$35.00</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">OpenAI</a></p></td></tr><tr><td><p>GPT-5.5 Instant (chat-latest)</p></td><td><p>$5.00</p></td><td><p>$30.00</p></td><td><p>$35.00</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">OpenAI</a></p></td></tr><tr><td><p>Sakana Fugu Ultra (≤272K)</p></td><td><p>$5.00</p></td><td><p>$30.00</p></td><td><p>$35.00</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Sakana AI</a></p></td></tr><tr><td><p>GPT-5.6 Sol</p></td><td><p>$5.00</p></td><td><p>$30.00</p></td><td><p>$35.00</p></td><td><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">OpenAI</a></p></td></tr><tr><td><p><b>Claude Fable 5 / Claude Mythos 5</b></p></td><td><p><b>$10.00</b></p></td><td><p><b>$50.00</b></p></td><td><p><b>$60.00</b></p></td><td><p><b></b><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer"><b>Anthropic</b></a></p></td></tr></tbody></table><p>However, to incentivize immediate enterprise adoption following the export control order disruption saga, Anthropic is executing a temporary rollout plan through July 7. </p><p>For Pro, Max, Team, and select Enterprise subscriptions, Fable 5 usage will be included at no added cost for up to 50% of a user’s weekly tier allowance.</p><p>However, after July 7, Fable 5 will move to usage credits for those plans. For standard Enterprise seats, there is no included Fable 5 allowance; all usage is billed through credits, and the model will not work for those users unless credits are enabled.</p><p>Already, some AI influencers are attempting to offer enterprises and developers guidance on how to maximize their usage of Fable 5 during its 7-day discounted price/subscription included promotion:</p><div></div><h2><b>Chronology of a Crisis: From Launch to Lockout</b></h2><p>The whiplash regulatory cycle surrounding the model underscores the volatility currently facing enterprise software supply chains. The crisis unfolded over a rapid, three-week timeline:</p><ul><li><p><b>June 9, 2026:</b> <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Anthropic launches Claude Fable 5 and Mythos 5</a>. Early corporate case studies report major performance gains. For instance, Stripe reports that Fable 5 compressed a codebase-wide migration across a 50-million-line Ruby infrastructure into a single day — a project estimated to take a team more than two months by hand.</p></li><li><p><b>June 12, 2026:</b> At 5:21 PM ET, the U.S. government issues an export-control directive citing national security authorities. The order bans access to the models by any foreign national, whether inside or outside the borders of the United States. Lacking real-time mechanisms to verify user nationality at the API layer, Anthropic is forced to pull the plug for all customers to ensure compliance. Anthropic says access to all other Anthropic models was not affected.</p></li><li><p><b>June 13–25, 2026:</b> Enterprise users and developers face abrupt disruption, forcing workflows that had adopted Fable 5 or Mythos 5 to fall back to older models such as Opus 4.8. Tensions peak as Anthropic publicly objects, arguing that pulling a major commercial model over a narrow jailbreak finding could “essentially halt all new model deployments for all frontier model providers.”</p></li><li><p><b>June 26, 2026:</b> The U.S. government allows Anthropic to restore Mythos 5 access to a set of trusted U.S. organizations, partially reversing the June 12 order. Anthropic says it is restoring access for those organizations and continuing to work with the government to expand Mythos 5 access and make Fable 5 generally available again.</p></li><li><p><b>June 30, 2026:</b> Commerce Secretary Howard Lutnick sends a letter withdrawing the June 12 export-control license requirement for both Mythos and Fable. The decision removes the emergency legal block, but Anthropic’s rollout still treats the models differently: Fable 5 returns globally, while Mythos 5 remains limited to approved users through Glasswing and related trusted-access channels.</p></li></ul><h2><b>The Technical Catalyst: The Amazon Vulnerability Report</b></h2><p>The swift intervention by the federal government stemmed from a report by Amazon researchers describing a method for bypassing Fable 5’s safeguards. This was a brutal irony for Anthropic, given Amazon was one of the startup's initial and largest backers to the <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">tune of $8 billion</a>, and the two companies previously collaborated on <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">improving Amazon's Alexa+ voice assistant</a>.</p><p>According to Anthropic, the technique prompted Fable 5 to identify software vulnerabilities; in one case, the model produced code demonstrating how the relevant vulnerability could be exploited.</p><p>When the report reached government officials, it triggered alarm regarding the offensive cyber capabilities of public LLMs. Anthropic countered that the exploit did not tap into unique “Mythos-level” cyber capabilities, noting that its own testing found other models — including Claude Opus 4.8, OpenAI’s GPT-5.5, and Moonshot’s Kimi K2.7 — could identify the same vulnerabilities. Anthropic also said every model it tested could produce the same exploit demonstration as Fable 5.</p><p>To break the regulatory logjam, Anthropic developed an improved automated safety classifier specifically trained to catch and neutralize the Amazon technique. Tested by the Commerce Department’s Center for AI Standards and Innovation (CAISI), the updated classifier successfully halts that specific technique in more than 99% of cases.</p><p>Anthropic explicitly warns enterprise clients that this safety enforcement comes at an operational cost. Because the new classifiers require an expanded “safety margin” to catch ambiguous edge cases, benign coding and debugging requests may be flagged more often. When a prompt is blocked by the safety layer, the active session automatically downgrades, routing the request to Opus 4.8.</p><h2><b>Backroom Diplomacy: The Shifting of the Guard</b></h2><p>The breakthrough that brought Fable 5 back to commercial markets was as much political as it was technical. According to <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">WIRED</a>, Anthropic initially argued that the administration’s security concerns were overblown and that no frontier model provider could guarantee zero jailbreaks.</p><p>That argument frustrated the administration, according to WIRED’s reporting. In recent weeks, Anthropic changed tack, focusing less on the theoretical impossibility of eliminating jailbreaks and more on building stronger safeguards and satisfying the government’s operational concerns.</p><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">WIRED reported</a> that Anthropic CEO Dario Amodei was recently replaced in meetings by Brown, whom officials liked more personally. Brown is also the addressee of Lutnick’s June 30 Commerce letter.</p><p>Under Brown’s guidance, Anthropic appears to have moved from arguing over the absolute limits of model safety to committing to the expanded safeguards and collaboration framework the administration demanded.</p><p>The resulting Commerce letter describes several commitments by Anthropic. Under the terms of the clearance, Anthropic has agreed to:</p><ol><li><p>Proactively detect and address security risks associated with the models.</p></li><li><p>Work with the U.S. government on protocols, standards and releases for Mythos, Fable and future models.</p></li><li><p>Inform the U.S. government of malicious activity.</p></li></ol><p>Separately, Anthropic says it will expand pre-release government access and evaluation for frontier models, share information rapidly when significant jailbreaks or misuse patterns are identified, dedicate resources to joint government research and work toward a common industry security bar.</p><p>The U.S. Commerce Department explicitly reserved the right to re-evaluate these permissions and re-impose license requirements if circumstances change or if Anthropic fails to meet its commitments.</p><h2><b>The Sovereign Calculus: Lessons for Enterprise AI</b></h2><p>The two-week blackout of Claude Fable 5 exposed the fragility of centralized, closed-API models for modern business infrastructure. It showed that enterprise automation pipelines remain vulnerable to sudden regulatory shifts and vendor compliance mandates.</p><p>The tech community’s response highlights a broader push toward hardware and model sovereignty. Following the initial shutdown, prominent tech figures voiced concerns over this centralization. <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">AI founder Alex Finn </a>described the Anthropic freeze as a major “wakeup call,” urging developers to invest heavily in local, open-weights infrastructure to insulate operations from federal volatility. As Finn noted on social media:</p><blockquote><p>“No company or government will EVER be able to take away your local models.”</p></blockquote><p>For enterprise architects, the return of Fable 5 demands a balanced approach to deployment:</p><ul><li><p><b>The Frontier Performance Advantage:</b> Utilizing closed models like Fable 5 offers state-of-the-art capabilities across agentic coding, long-context work, document reasoning and multi-step enterprise automation, according to Anthropic’s launch materials and early customer examples.</p></li><li><p><b>The Mitigating Data Trade-Off:</b> Accessing Fable 5 means accepting Anthropic’s mandatory 30-day data retention requirement for covered models. Anthropic says prompts and model completions are retained for at least 30 days by default and then automatically deleted, except when they are part of a safety investigation or must be kept for legal reasons. Highly regulated financial, healthcare and legal groups must evaluate whether this telemetry window complies with their data privacy mandates.</p></li></ul><p>The truth is, enterprises in the U.S. and globally have more options than ever for frontier-class LLMs, especially with the recent launch over the last few months of new, powerful, open weights Chinese alternatives that can be downloaded, run locally or on virtual private clouds, and customized to an enterprise's liking. </p><p><a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">MiniMax M3 </a>pairs frontier-tier coding and agentic performance with a 1 million-token context window and native multimodality. Z.ai’s <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">GLM-5.2's benchmark results</a> exceed OpenAI's GPT-5.5 on SWE-bench Pro and several long-horizon coding tests, and near Claude Opus 4.8 on FrontierSWE and MCP-Atlas. <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">Meituan’s LongCat-2.0 </a>is also positioned around enterprise use, with a 1 million-token context window, MIT licensing and strong early developer traction through its Owl Alpha run on OpenRouter — though as we reported, the full weights are still listed as “coming soon.” </p><p>Meanwhile, Anthropic's top domestic rival OpenAI is still struggling to release its latest models broadly due to U.S. government pressure. The company says its <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">newest and most powerful models, GPT-5.6 Sol, Terra and Luna</a> — unveiled last week — are starting in a limited preview for a small group of trusted partners after OpenAI previewed the models and their capabilities to the U.S. government and the government requested the rollout be staggered.</p><p>OpenAI says it still plans broader availability, but argued in its <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">announcement</a> that this kind of staggered rollout at the government's request "should become the long-term default. It keeps the best tools from users, developers, enterprises, cyber defenders, and global partners who need them. We are taking this short-term step because we believe it is the strongest path to broader availability in the coming weeks, while we work with the Administration to develop the cyber Executive Order framework and a repeatable process for future model releases."</p><p>The executive order in question, signed by <a href="https://tsecurity.de/weiterlesen/3610882/3639021/anthropic-is-bringing-back-claude-fable-5-globally-after-us-lifts-export-control-order-where-can-enterprises-access-it/" target="_blank" rel="noopener noreferrer">President Donald J. Trump on June 2, 2026</a>, calls upon various federal agencies to collaborate on a process for benchmarking and assessing capabilities of new AI models to ensure they are safe and appropriate for wide release, a process supposed to take 30 days (which would seem to indicate the agencies are due to provide their process tomorrow, July 2, 2026.)</p><p>Frontier model launches are starting to look less like ordinary product releases and more like negotiated deployments shaped by U.S. national security review — a shift that could slow American distribution even as Chinese competitors move aggressively through open-weight and lower-cost channels</p><p>To safeguard operations against future regulatory lockouts, enterprise technical leaders are moving toward model-agnostic fallback architectures. </p><p>By deploying proxy layers that can dynamically reroute critical production pipelines from proprietary APIs to locally hosted, open-weights alternatives, businesses can leverage top-tier capabilities without exposing themselves to single-point-of-failure vulnerabilities. </p><p>Fable 5 is officially back online, but the landscape governing its release has been fundamentally transformed.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Fake Praise, Real Money]]></title>
<description><![CDATA[Patrick Radden Keefe, the best-selling author of Say Nothing and Empire of Pain, both adapted into critically acclaimed television series, has become accustomed to a daily ritual that has nothing to do with writing. It involves scanning his inbox, identifying the latest batch of elaborately craft...]]></description>
<link>https://tsecurity.de/de/3638332/sichere-programmierung/fake-praise-real-money/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3638332/sichere-programmierung/fake-praise-real-money/</guid>
<pubDate>Wed, 01 Jul 2026 13:30:17 +0200</pubDate>
<content:encoded><![CDATA[<p>Patrick Radden Keefe, the best-selling author of <em>Say Nothing</em> and <em>Empire of Pain</em>, both adapted into critically acclaimed television series, has become accustomed to a daily ritual that has nothing to do with writing. It involves scanning his inbox, identifying the latest batch of elaborately crafted scam emails, and deleting them. “Every morning I wake up to two or three of these emails,” Keefe told The Hollywood Reporter in March 2026. Dan Brown, whose <em>The Da Vinci Code</em> has sold more than 80 million copies, has taken to sharing particularly egregious examples on Facebook. Neither fame nor decades of publishing experience offers immunity. The scammers do not discriminate; they simply scale.</p>

<p>What has changed is not the existence of publishing fraud, which has plagued authors for as long as there have been authors, but the sheer velocity and personalisation of the attacks. Generative AI has handed the global scam industry a set of tools that transform what was once a crude, spray-and-pray operation into something resembling a bespoke concierge service for deception. The emails arrive with flattering assessments of an author's prose style, detailed references to specific books, and proposals wrapped in the language of legitimate publishing. They are, in the words of Victoria Strauss, the veteran watchdog behind Writer Beware, evidence that “generative AI has become embedded in the world of overseas writing fraud.”</p>

<p>This is the story of how that embedding works, who it targets, and why, despite its increasing polish, the scam layer remains riddled with structural failures that authors can learn to spot.</p>

<h2>
  
  
  The Anatomy of a Personalised Attack
</h2>

<p>The mechanics begin with data harvesting. Amazon author pages, Goodreads profiles, personal websites, social media accounts, and even contact forms on professional directories all serve as raw material. Scammers, or more precisely the large language models they deploy, scrape these sources to construct emails that feel uncannily specific. Children's book author Jonathan Emmett received one in July 2025, headed “Your book Sky Boy really caught my eye!” The message arrived via his website's contact form, ostensibly from a woman calling herself “Jess Amon.” It contained enough surface-level detail to seem plausible, yet it also asked whether <em>Sky Boy</em> was his first children's book, a question anyone who had actually visited his website could have answered in seconds.</p>

<p>That gap between apparent sophistication and actual knowledge is the signature of AI-assisted fraud. The technology excels at generating plausible prose from minimal input. Feed it a book title, an Amazon blurb, and a Goodreads review, and it will produce a paragraph of praise that reads as though the sender spent an afternoon with the manuscript. Feed it nothing beyond a name and genre, and the cracks appear almost immediately. Emmett ran several of the emails he received through AI content detectors; some returned scores of 100 per cent AI-generated text.</p>

<p>The Authors Guild, which represents more than 13,000 writers in the United States, has documented the pipeline in considerable detail. Scammers' AI tools scan Amazon listings for recently published titles, pull blurbs and review excerpts, and generate initial outreach emails within minutes. One theory circulating among publishing watchdogs is that the bots monitor Goodreads for fresh reviews, using those reviews as the basis for the first email's flattering commentary. The result is a message that appears to reference the book's themes, characters, or prose style, but which, on closer inspection, merely paraphrases publicly available marketing copy. The Society of Authors has noted that the AI used to draft these messages may have illegally scraped authors' published works, which would explain how some scammers are able to include references to specific character arcs or thematic elements.</p>

<p>Anne R. Allen, a veteran author and writing blogger who has tracked these scams since mid-2025, estimates she has received more than a thousand such emails. She describes the deluge as “proliferating like Tribbles,” the self-replicating creatures from <em>Star Trek</em>, and suspects that the number of active scam operations now vastly exceeds the number of authors they target. “There may be 10, 20, or even 30 times as many scammers as there are authors,” she wrote in a November 2025 update on her blog. Allen has become something of an inadvertent expert on the phenomenon, partly because her email address has been assigned to at least seven different authors by scammers' faulty data matching. She regularly receives emails praising novels about Guernsey, studies of the Weimar Republic, and invitations to Paris eyewear exhibitions, none of which have anything to do with her actual writing.</p>

<h2>
  
  
  The Emotional Architecture of the Con
</h2>

<p>The most effective author scams do not begin with suspicious links or clumsy language. They begin by triggering emotion. Scammers understand, with a precision that borders on the clinical, that authors are deeply invested in their work and frequently navigating uncertainty around marketing, visibility, and reader engagement. The period leading up to a book's publication is particularly dangerous: authors vacillate between the hope that the fruit of their labour will reach the bestseller lists and the dread that it will disappear into the vast ocean of published titles. When a scammer taps into that emotional vulnerability, normal caution can temporarily shut down.</p>

<p>The flattering AI-generated emails exploit this dynamic with ruthless efficiency. They arrive with subject lines that promise recognition (“Your novel deeply moved our editorial team”) and opening paragraphs that offer the one thing most authors crave: evidence that someone has actually read their book. The praise is almost always generic enough to apply to any work of fiction or non-fiction, yet specific enough, thanks to scraped metadata, to feel personal. Authors who are not vigilant about the mechanics of the publishing industry can find themselves several emails deep into a conversation before the financial request surfaces.</p>

<p>The emotional manipulation extends beyond flattery. Some scams create urgency (“This opportunity is available only until the end of the month”), while others invoke exclusivity (“Your title was selected from more than 10,000 submissions”). The book club variant, which proliferated throughout late 2025, promised access to reading groups with thousands or even hundreds of thousands of members who would provide reviews and exposure, asking only for a modest “tip” of $25 per member or an “administrative fee” of a few hundred dollars. The numbers are calculated to seem reasonable relative to the promised exposure, yet they add up quickly across hundreds of targeted authors.</p>

<h2>
  
  
  The Spoofed Domain Playbook
</h2>

<p>If the flattering email is the opening gambit, the spoofed domain is the closing trap. Impersonation scams, according to Writer Beware, now represent more than half of all questions and complaints the organisation receives. The technique is deceptively simple: register a domain that is almost, but not quite, identical to a legitimate publisher, agency, or industry body, then use it to send emails that carry the visual authority of the real thing.</p>

<p>The examples are instructive. In one documented case, scammers registered the domain “hgbusa.com,” a near-perfect match for the real “hbgusa.com” belonging to Hachette Book Group USA. In another, the email address @dcl-agency.com mimicked DCL Literary's genuine @dclagency.com, differing only by a single hyphen. A fraudulent Celadon Books email domain was registered just months before being deployed, a timeline that would make no sense for an imprint that has existed since 2017. Authors have reported receiving emails appearing to come from Penguin Random House, only to discover on close inspection that an apparent “m” in the domain name was actually a deceptively arranged “rn.” These are not random errors; they are calculated bets that busy, hopeful authors will not scrutinise the sender's address character by character.</p>

<p>The problem has grown severe enough that every Big Five publisher now maintains dedicated fraud alert pages. Hachette Book Group warns that scammers “frequently impersonate HBG employees in email, on social media, and on the phone to deceive authors into thinking HBG is interested in publishing their manuscripts.” Penguin Random House's Corporate Information Security Team has flagged “several phishing schemes in which employees at PRH and other publishing-industry companies are being impersonated to target authors and agents.” Simon and Schuster confirms that “third parties unaffiliated with Simon and Schuster have been impersonating Simon and Schuster employees, literary agents, and providers of other literary services.” The uniformity of these warnings across the industry tells its own story.</p>

<p>In February 2026, Victoria Strauss published one of her most detailed investigations to date, deconstructing a scam that impersonated Simon and Schuster. The fraudsters used the email address “<a href="mailto:simonschusterllc4@gmail.com">simonschusterllc4@gmail.com</a>,” a choice that combined the publisher's name with a free email service that no Big Five house would ever use for professional correspondence. Strauss, who has been investigating publishing scams for more than two decades through Writer Beware's partnership with the Science Fiction and Fantasy Writers Association, decided to engage the scammers directly.</p>

<p>She submitted three chapters of what she described as an “unmarketable trunk novel” donated by a friend specifically for investigative purposes. The response was swift and enthusiastic. Within hours, the fake Simon and Schuster offered a publishing deal complete with a $500,000 advance, a comprehensive “publishing plan” covering developmental editing, global distribution, audiobook production, and marketing strategy, and breathless prose about the manuscript's commercial potential. The plan was elaborate, running to several pages, and clearly designed to overwhelm with detail.</p>

<p>Then came the pivot. The conversation shifted from traditional publishing to self-publishing packages, with prices ranging from $1,500 to $15,000. Wire transfer instructions directed payments to an account under the name “Ezekiel Ayomiposi Adepitan” at Wells Fargo in Delaware. Email headers revealed a timezone offset of +0100, consistent with West Africa rather than the East Coast of the United States.</p>

<p>“A Big 5 publisher would be emailing from their own web domain, not a Gmail address,” Strauss noted. The observation is obvious in retrospect, yet the scam's elaborate staging is designed to ensure that retrospect arrives too late.</p>

<h2>
  
  
  The Book-to-Film Grift
</h2>

<p>No variant of the author scam has proved more financially devastating than the book-to-film scheme. In January 2025, a federal grand jury in the Southern District of California indicted three individuals connected to PageTurner, Press and Media LLC, a Chula Vista-based company that the FBI estimates defrauded more than 800 authors of at least $44 million between 2017 and 2024.</p>

<p>The defendants were Gemma Traya Austin of Chula Vista, and Michael Cris Traya Sordilla and Bryan Navales Tarosa, both of the Philippines. Sordilla is Austin's nephew. The operation worked through Innocentrix Philippines, a business process outsourcing company whose employees contacted authors through unsolicited calls and emails, claiming that publishers and Hollywood studios were interested in acquiring their books. Victims were told they needed to pay for treatments, scripts, logline synopses, pitch decks, and sizzle reels before their material could be optioned. Individual losses ranged from $7,000 to $35,000, with the Authors Guild reporting awareness of at least one victim who lost $800,000.</p>

<p>Federal authorities seized more than $5.8 million from multiple bank accounts, including $3.5 million from PageTurner's business account and nearly $905,000 from Austin's personal account. All three defendants face charges of conspiracy to commit mail and wire fraud and money laundering conspiracy, carrying maximum sentences of 20 years in prison.</p>

<p>Strauss described PageTurner's model as “a type of pig butchering scam, where victims are tricked into handing over their assets via escalating demands for money.” The terminology, borrowed from cryptocurrency fraud, is apt. Each payment creates a sunk-cost psychology that makes the next payment feel more rational, not less. The scam does not end when the author runs out of patience; it ends when the author runs out of money. One documented case illustrates the mechanics with painful clarity: a self-published author was contacted by someone claiming to be a Hachette employee who said an agent had given him a copy of her book. She paid this individual more than $14,000 for purported “printing” and other fees, and even flew from California to Hachette's New York office, where no one had heard of her or her book.</p>

<p>The PageTurner operation was unusually large, but the model persists under different names. Writer Beware has tracked iterations operating as “Motionflick Studios” and “Snow Day Film,” both of which send unsolicited emails claiming interest in film adaptations, name-dropping real Hollywood figures without their knowledge or consent, then referring authors to services that charge thousands of dollars for materials no legitimate producer would ever request. In a grim coda to the PageTurner arrests, authors who had been defrauded reported receiving calls from a “US Literary Law Firm” offering “representation” for victims in exchange for a fee of $1,200. The law firm did not exist. The secondary scam was targeting the victims of the primary one.</p>

<p>The fundamental rule is straightforward: in a genuine film deal, the production company pays the author for rights, not the other way around. Yet the emotional architecture of the scam, the appeal to an author's fantasy of seeing their work on screen, consistently overrides this logic.</p>

<h2>
  
  
  Celebrity Impersonation and the Trust Chain
</h2>

<p>A particularly insidious variant involves scammers impersonating well-known authors. Writer Beware has documented cases involving fake accounts purporting to be Suzanne Collins, Stephen King, Brandon Sanderson, Danielle Steel, Colson Whitehead, Claire Keegan, Cixin Liu, and numerous others. The pattern follows a predictable sequence: a friendly initial message praising the target's writing, a series of exchanges that build rapport (often sustained by generative AI, making the conversation semi-automated), and eventually a referral to a paid service for editing, marketing, or representation.</p>

<p>In one documented variant, the fake famous author recommends the target to their “literary agent,” who then requests a manuscript submission and offers representation, conditional on the manuscript first undergoing professional editing. The target is directed to a fake editor, often operating under a generic name, who demands $700 to $800 via PayPal, with payments traced to accounts in Nigeria. In an alternative version, the impersonator skips the agent intermediary entirely and connects the writer directly with a fake book marketer requiring upfront payment.</p>

<p>Science fiction author John Scalzi reported in January 2026 that three times in a single week he received inquiries from other authors about emails sent from an account impersonating him. The messages praised the recipients' books in what Scalzi described as “AI-generated fashion” and attempted to initiate an exchange that would ultimately lead to a financial request. Scalzi, who writes the popular blog <em>Whatever</em>, was blunt in his assessment: “Every single one of these emails is absolutely a scam, none of these promoters and/or book clubs are real.” The impact extended beyond financial fraud; Scalzi announced an indefinite hiatus from book club engagements because it had become “exponentially more difficult to suss out legitimate convention and book festival invitations and paid speaking gigs from a sea of AI-generated asks.”</p>

<p>Author Evelyn Skye discovered that her own identity had been weaponised when she learned that scammers had created fake social media accounts using her author photo and content lifted from her legitimate profiles. The accounts were sophisticated enough to fool authors who were not already familiar with Skye's actual online presence.</p>

<p>Even Writer Beware itself has not been spared. In November 2024, Strauss reported a new impersonation attempt in which someone posed as her, eventually requesting a $1,000 fee from a writer. Digital forensics pointed to Innocentrix, the same Philippines-based operation connected to the PageTurner indictment.</p>

<h2>
  
  
  The Numbers Behind the Noise
</h2>

<p>The author-targeting scam epidemic exists within a broader landscape of AI-enabled fraud that has grown exponentially. According to threat intelligence data compiled by cybersecurity firms throughout 2025, AI-enabled fraud surged by 1,210 per cent, with fraud losses from generative AI projected to rise from $12.3 billion in 2024 to $40 billion by 2027, a compound annual growth rate of 32 per cent.</p>

<p>The phishing statistics are equally striking. Research published by Cofense found that 82.6 per cent of phishing emails now incorporate some form of AI-generated content, with more than 90 per cent of polymorphic attacks (those that vary their content to evade detection filters) leveraging large language models. AI-generated phishing emails achieve click-through rates more than four times higher than their human-crafted equivalents. A campaign documented by Brightside AI, which targeted 800 accounting firms with AI-generated emails referencing specific state registration details, achieved a 27 per cent click rate, far above the industry average for phishing attempts. The technique is described as “polymorphic” phishing: attacks that appear new and unique on surface indicators but share the same underlying infrastructure.</p>

<p>The implications for authors are significant. Traditional red flags (the misspelled words, the awkward syntax, the obviously generic greetings) have been largely eliminated by AI. Scammers whose first language is not English can now produce emails that read as fluent, professional correspondence. Strauss has observed that while grammar and syntax errors have become much less common in initial emails, they may still surface “if the scammer goes off script,” for instance during a live chat or phone call where the AI layer is thinner.</p>

<p>This creates a paradox: the better the technology gets at mimicking legitimate communication, the more authors must rely on structural and contextual cues rather than surface-level language quality. The question is no longer “Does this email look professional?” but “Does this opportunity make sense?”</p>

<h2>
  
  
  Detectable Inconsistencies and Validation Failures
</h2>

<p>Despite the sophistication of AI-generated prose, the scams remain riddled with structural weaknesses that function as reliable indicators of fraud. These can be organised into several categories.</p>

<p>The first and most reliable is the email domain. Legitimate publishers, agents, and production companies use their own corporate domains. Gmail, Yahoo, Outlook, and other free email services are immediate red flags when attached to communications purporting to come from established industry entities. The fake Simon and Schuster used a Gmail address. The fake famous author accounts consistently operate through Gmail. Penguin Random House has specifically flagged “<a href="mailto:penguinrandomhousellc@gmail.com">penguinrandomhousellc@gmail.com</a>” as a known fraudulent address, noting that its official domains are @penguinrandomhouse.com and <a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">@prh</a>.com. This single check would eliminate a substantial proportion of scam attempts.</p>

<p>The second category involves temporal implausibility. Legitimate publishing processes move slowly. A major publisher does not discover an unknown author's self-published book, read it, prepare a detailed publishing plan, and offer a $500,000 advance within 24 hours. The speed of the response is itself evidence of fraud. In Strauss's Simon and Schuster investigation, the entire cycle from submission to offer took less than a day, a timeline that would be physically impossible in traditional publishing, where manuscript evaluation alone typically requires weeks or months.</p>

<p>The third category is financial directionality. In legitimate publishing, money flows from publisher to author, not the reverse. In legitimate film deals, the production company acquires rights from the author. In legitimate literary representation, agents earn commission on sales rather than charging upfront fees. Any request for payment from an author, whether framed as an “administrative fee,” a “marketing investment,” or a “printing cost,” inverts the normal financial relationship and should trigger immediate scepticism. The amounts demanded vary widely, from the $25 “tips” requested by fake book clubs to the $15,000 self-publishing packages offered by fake Simon and Schuster, to the $35,000 extracted by PageTurner for non-existent film deals.</p>

<p>The fourth category involves verifiable identity. When a communication claims to originate from a known entity, verification is often possible through a single independent action: visiting the entity's official website, calling the publicly listed phone number, or checking the contact information published on professional directories. Simon and Schuster maintains an official fraud alert page. Penguin Random House has constructed dedicated telephone and email support for authors who suspect they have been targeted. Hachette Book Group publishes cybersecurity guidance specifically for authors. The Authors Guild publishes a regularly updated list of known scams. These resources exist specifically because the volume of fraud has made them necessary.</p>

<p>The fifth category is contextual incongruity. The fake “Jess Amon” who contacted Jonathan Emmett asked whether <em>Sky Boy</em> was his first children's book, a question rendered absurd by five seconds of research. The scam emails that Anne R. Allen receives frequently reference books she did not write, because scammers' AI tools have confused her with other people named Anne Allen. When an email from a supposed agent or editor contains praise that could apply to literally any book in the genre, the personalisation is performative rather than genuine. These errors reveal the limits of automated personalisation: the AI can generate convincing prose, but it cannot always verify the accuracy of the data it has been fed.</p>

<h2>
  
  
  Defensive Practices and Verification Workflows
</h2>

<p>The author community has, through painful collective experience, developed a set of defensive practices that significantly reduce vulnerability. The most effective of these are not technological but procedural, rooted in an understanding of how the publishing industry actually operates.</p>

<p>The first principle, articulated consistently by the Authors Guild, Writer Beware, and experienced authors, is that unsolicited offers should be treated as fraudulent until independently verified. Nathan Bransford, a former literary agent turned writing adviser, summarised the position in a January 2025 blog post: legitimate publishing professionals rarely approach unknown authors out of the blue, and when they do, they never require upfront payment. The Authors Guild's guidance is similarly direct: “The first rule of thumb is that if someone solicits you out of the blue with an offer that seems too good to be true, it probably is.”</p>

<p>The second principle involves independent verification through official channels. If an email claims to come from Simon and Schuster, the author should visit simonandschuster.com directly (not through any link in the email) and use the contact information published there. If an “agent” claims to represent a known agency, the author should check the agency's official website for that individual's name. Penguin Random House advises authors to “ask them to send an email from their PRH address, and be sceptical if they give an excuse for not doing so.” This takes minutes and eliminates most impersonation attempts.</p>

<p>The third principle is community-based intelligence sharing. Writer Beware, operated by Victoria Strauss in partnership with the Science Fiction and Fantasy Writers Association, functions as the publishing industry's most sustained investigative presence, tracking scams and deceptive operations for more than two decades. The organisation maintains an impersonation list that catalogues known spoofed entities, including the specific email domains used. Known fraudulent domains associated with agent impersonation scams include @groupofacquisitions.com, @directacquisitionsteam.com, @literaryacquisitionsguild.com, @literaryendorsement.com, and @literarytraditionalendorsement.com. The Authors Guild publishes scam alerts and offers direct support to members who have received suspicious communications. Authors can report suspected scams to Writer Beware at <a href="mailto:beware@sfwa.org">beware@sfwa.org</a> or to the Authors Guild at <a href="mailto:staff@authorsguild.org">staff@authorsguild.org</a>.</p>

<p>The fourth principle is pattern recognition through education. The Authors Guild's guidance emphasises that the single most effective defence is understanding how the publishing industry works. Authors who know that legitimate agents earn commission rather than charging fees, that major publishers acquire through agents rather than cold emails, and that film producers pay for rights rather than requesting pitch materials, are substantially harder to defraud. The scams succeed precisely because they target authors who lack this knowledge, often first-time or self-published writers navigating an unfamiliar industry.</p>

<p>John Scalzi has advocated for what amounts to a zero-trust policy: “When someone proactively reaches out to you, you have to assume it's fake until you can prove otherwise.” This approach, while potentially causing authors to miss rare legitimate opportunities, reflects the current reality that the signal-to-noise ratio in author inboxes has deteriorated to the point where assuming legitimacy is no longer rational.</p>

<p>For authors who have already engaged with a suspected scam, the FBI maintains a dedicated contact address at <a href="mailto:AuthorFraud@fbi.gov">AuthorFraud@fbi.gov</a>, established in connection with the PageTurner investigation. The National Elder Fraud Hotline (1-833-FRAUD-11) provides additional support, reflecting the disproportionate targeting of older authors by these operations.</p>

<h2>
  
  
  The Structural Paradox of AI-Assisted Fraud
</h2>

<p>There is an irony at the heart of the AI scam epidemic that targeting authors reveals with particular clarity. The same technology that makes the emails more polished also makes them more generic. The same automation that allows scammers to contact thousands of authors simultaneously prevents them from doing the one thing that would make their approaches truly convincing: actually reading the books.</p>

<p>This is the structural paradox of AI-assisted fraud. It can produce prose that passes a cursory inspection, but it cannot generate genuine engagement with an author's work. It can scrape Amazon for a book's blurb, but it cannot discuss a specific scene. It can generate a publishing plan that runs to several pages, but it cannot explain why a particular manuscript would appeal to a particular audience in terms that reflect actual market knowledge. The sophistication is real, but it is shallow. It operates at the level of surface plausibility rather than substantive understanding.</p>

<p>This shallowness is, for now, the author's best defence. An email that praises your “masterful exploration of the human condition” without referencing a single character, scene, or argument is almost certainly generated by software that has never encountered your work beyond its metadata. A publishing offer that arrives within hours of submission is operating on a timeline that only makes sense if nobody actually read the manuscript. A film producer who requires you to pay for a sizzle reel has fundamentally misrepresented the economics of the entertainment industry.</p>

<p>The scam layer, in other words, is sophisticated enough to get through the door but not sophisticated enough to survive sustained scrutiny. The challenge for the author community is to ensure that scrutiny becomes reflexive, embedded in the culture of publishing as a standard operating procedure rather than an afterthought. Organisations such as Writer Beware and the Authors Guild have spent decades building the infrastructure for exactly this kind of collective defence. The question is whether that infrastructure can scale as fast as the scams.</p>

<p>The data suggest it will need to. With AI-enabled fraud growing at a compound annual rate of 32 per cent, and phishing attacks achieving click-through rates four times higher than their pre-AI equivalents, the volume and velocity of author-targeting scams will only increase. The technology will improve. The emails will become more convincing. The spoofed domains will become harder to distinguish from the real thing.</p>

<p>But the fundamental structure of the scam will remain: the demand for money flowing in the wrong direction, the implausible timelines, the unverifiable identities, the gap between surface polish and substantive knowledge. These are not bugs in the scam's design; they are features of its economics. Fraud that does not eventually request payment is not fraud. Deception that can withstand full verification is not deception aimed at volume targets. The scam layer is, by its nature, a structure that appears solid from a distance but collapses under pressure.</p>

<p>The task for authors is to apply that pressure early and consistently. The tools exist. The knowledge is available. The community is organised. What remains is the discipline to use them, especially when the email in your inbox is telling you exactly what you want to hear.</p>




<h2>
  
  
  References and Sources
</h2>

<ol>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">A New AI Scam Is Targeting Thousands of Authors. I Was One of Them – The Hollywood Reporter</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Not Simon &amp; Schuster: Deconstructing an Impersonation Scam – Writer Beware</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">The Impersonation List – Writer Beware</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">If a Famous Author Calls, Hang Up: Anatomy of an Impersonation Scam – Writer Beware</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Wolves in Authors' Clothing: Beware Social Media Marketing Scams – Writer Beware</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Dogging the Watchdog Redux: Someone Else is Impersonating Writer Beware</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Two New Impersonation Scams to Watch For – Writer Beware</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">From Motionflick Studios to Snow Day Film: The Evolution of a Book-to-Film Scam – Writer Beware</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Three Indicted and Internet Domain Seized in $44 Million Nationwide Book Publishing Scam – US Department of Justice</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Karma's a Bitch: The Law Catches Up With PageTurner Press and Media – Writer Beware</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">FBI Arrests Individuals Behind PageTurner Scam – The Authors Guild</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Publishing Scam Alerts – The Authors Guild</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Avoiding Publishing Scams – The Authors Guild</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Yes, All Those Author Services and Book Club Emails Are Fake – John Scalzi, Whatever</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Reminder: Scammers Are Out There Pretending to Be Me – John Scalzi, Whatever</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">A Sad Commentary on the State of Writer-Related Spam – John Scalzi, Whatever</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Update on Those Flattering AI Book Marketing Scams – Anne R. Allen</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Those Flattering Emails Filling Your Inbox: An AI Scam – Anne R. Allen</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">The Hidden World of Writing Scams – Anne R. Allen</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">AUTHORS BEWARE! If You Receive a Flattering Email About Your Book, It May Be Written by an AI – Jonathan Emmett</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Publishing Scams Are Rampant: How to Be Vigilant – Nathan Bransford</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Simon &amp; Schuster Fraud Alert</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Combatting Fraud – Penguin Random House</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Identifying Impersonation Phishing Scams – Penguin Random House News for Authors</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Fraud Alert – Hachette Book Group</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Author Impersonation and Other Scams – Evelyn Skye</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">AI-Generated Phishing vs Human Attacks: 2025 Risk Analysis – Brightside AI</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">How AI Made Scams More Convincing in 2025 – Malwarebytes</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">The Rise of AI-Powered Phishing 2025 – CybelAngel</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Guest Post: How a Book Really Becomes a Movie – Writer Beware</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">Authors Hit with Deluge of Scam Emails from Fake Marketers – The Bookseller</a></li>
<li><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">PageTurner's $44 Million Fraud Charges Cast Spotlight on Author Services – Bloomberg</a></li>
</ol>




<p><a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer"><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%2Fos7pdncawa0mgqcin0gf.png" alt="Tim Green" width="100" height="100"></a></p>

<p><strong>Tim Green</strong><br>
<em>UK-based Systems Theorist &amp; Independent Technology Writer</em></p>

<p>Tim explores the intersections of artificial intelligence, decentralised cognition, and posthuman ethics. His work, published at <a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">smarterarticles.co.uk</a>, challenges dominant narratives of technological progress while proposing interdisciplinary frameworks for collective intelligence and digital stewardship.</p>

<p>His writing has been featured on Ground News and shared by independent researchers across both academic and technological communities.</p>

<p><strong>ORCID:</strong> <a href="https://tsecurity.de/weiterlesen/3610193/3638332/fake-praise-real-money/" target="_blank" rel="noopener noreferrer">0009-0002-0156-9795</a> <br>
<strong>Email:</strong> <a href="mailto:tim@smarterarticles.co.uk">tim@smarterarticles.co.uk</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Sonnet 5 launches: Opus performance at lower cost]]></title>
<description><![CDATA[This week was largely a Claude story: Sonnet 5 landed with enough benchmark muscle to make Opus feel redundant for most workloads, and GitLab's production data backs up the claims. Alongside that, GitHub Copilot quietly dropped its JetBrains friction, and Google's image model got cheaper and fast...]]></description>
<link>https://tsecurity.de/de/3637976/sichere-programmierung/sonnet-5-launches-opus-performance-at-lower-cost/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3637976/sichere-programmierung/sonnet-5-launches-opus-performance-at-lower-cost/</guid>
<pubDate>Wed, 01 Jul 2026 11:28:20 +0200</pubDate>
<content:encoded><![CDATA[<p>This week was largely a Claude story: Sonnet 5 landed with enough benchmark muscle to make Opus feel redundant for most workloads, and GitLab's production data backs up the claims. Alongside that, GitHub Copilot quietly dropped its JetBrains friction, and Google's image model got cheaper and faster on Vercel's gateway. Here's what's worth acting on.</p>




<h3>
  
  
  Claude Sonnet 5 launches on Vercel AI Gateway
</h3>

<p>Sonnet 5 is available now via Vercel AI Gateway at <code>anthropic/claude-sonnet-5</code>. Launch pricing is $2/$10 per million input/output tokens—identical to Sonnet 4.6—but that rate expires August 31, after which it steps to $3/$15. The model matches Opus 4.8 on coding and agentic benchmarks, which means you can stop routing hard tasks to Opus and absorb a 50–67% cost reduction in the process.</p>

<p>For AI SDK users, this is a one-line change. Stronger long-context handling and document parsing are the practical wins for RAG pipelines and multi-turn agent workflows—two areas where Sonnet 4.6 had real rough edges.</p>

<p><strong>Verdict: Ship.</strong> Update your model identifier before August 31 while the launch pricing holds. Zero breaking changes, and there's no reason to stay on 4.6 for new work.</p>




<h3>
  
  
  Sonnet 5 closes Opus gap at lower cost
</h3>

<p>Beyond the Vercel integration, the broader Sonnet 5 release deserves its own read. The model is now the default reasoning tier replacing Sonnet 4.6 across Anthropic's plans, and the capability jump is specifically on agentic task completion—planning, multi-step tool use, brownfield code navigation. Early testers report that tasks which previously stalled midway through agent loops now finish end-to-end, which is a qualitatively different outcome from incremental benchmark gains.</p>

<p>The economics are straightforward: Opus-level performance at Sonnet prices through August, then a modest step up to $3/$15. If you're running production agents today, the cost-per-completed-task improvement compounds because you're paying less <em>and</em> spending fewer cycles on failure recovery and re-prompting.</p>

<p><strong>Verdict: Ship.</strong> Drop in <code>claude-sonnet-5</code> via the API endpoint, start with staging to baseline your cost-per-task delta, then promote. The migration risk is low; the upside on reliability-sensitive workflows is real.</p>




<h3>
  
  
  Copilot integrates natively into JetBrains IDEs
</h3>

<p>GitHub Copilot is now a native agent inside JetBrains IDEs—no ACP Registry plugin, no manual configuration. You select Copilot from the agent picker, authenticate via OAuth, and it works. CLI commands like <code>/remote</code> and <code>/chronicle</code> are available directly in IDE chat.</p>

<p>The practical difference here is reliability. The ACP Registry path worked, but it added setup friction and the occasional integration failure that made Copilot feel like a second-class citizen in JetBrains environments. Native embedding removes that layer. The catch: this requires an active GitHub Copilot subscription separate from JetBrains AI, so if you're paying for JetBrains AI today, budget for both or make a choice.</p>

<p><strong>Verdict: Ship</strong> if you're on JetBrains and already have a Copilot subscription—update your IDE and authenticate. <strong>Evaluate</strong> if you're currently using JetBrains AI exclusively; the overlap in functionality makes the dual-subscription cost worth scrutinizing before committing.</p>




<h3>
  
  
  Nano Banana 2 Lite ships on AI Gateway
</h3>

<p>Gemini 3.1 Flash Lite Image is now on Vercel's AI Gateway at $0.034 per 1,000 images—half the cost of the previous Nano Banana model—with sub-4-second latency and multimodal text+image output in a single API call.</p>

<p>The implementation change is minimal: set <code>model</code> to <code>google/gemini-3.1-flash-lite-image</code> and add <code>responseModalities: ['TEXT', 'IMAGE']</code> to your provider options. The real value is architectural—consolidated billing, unified retry logic, and no separate model call for image generation. For workflows that currently stitch together text and image requests, collapsing that into one SDK call reduces latency and operational complexity.</p>

<p><strong>Verdict: Ship</strong> for cost-sensitive image workloads. The pricing delta is significant enough to justify a migration even on modest volume, and there are no breaking changes to work around.</p>




<h3>
  
  
  Claude Sonnet 5 completes all GitLab benchmark tasks
</h3>

<p>GitLab published concrete numbers from their Duo Agent Platform: Sonnet 5 resolved 8.8% more issues than Sonnet 4.6 across their benchmark suite, and—more importantly—completed multi-step workflows without stalling. Sonnet 5 is now the default model tier for GitLab Duo on everyday dev work.</p>

<p>The 8.8% resolution rate improvement sounds modest until you consider what mid-execution failures actually cost: diagnosis time, re-prompting, and the mental overhead of supervising an agent that can't be trusted to finish. A model that completes reliably changes the delegation calculus. Agents become something you assign work to, not something you babysit. That shift compounds with the cost efficiency gains from Sonnet pricing.</p>

<p><strong>Verdict: Ship</strong> if you're running agents in production on GitLab. Switch to Sonnet 5 today—it's available across all deployment models with GitLab Premium/Ultimate or paid credits, and the reliability improvement is documented against real workloads.</p>




<h3>
  
  
  ADK for Go 2.0 adds graph-based workflow engine
</h3>

<p>ADK for Go 2.0 replaces ad-hoc agent orchestration with a declarative graph construction API. You define branching logic, fan-out, approval gates, and retry behavior as a graph rather than imperative control flow. Built-in human-in-the-loop support and durable state that survives process restarts are included.</p>

<p>This matters because multi-agent orchestration written imperatively gets brittle fast. Conditional branches, parallel tool calls, and approval workflows accumulate edge cases that are hard to test and harder to debug. A graph model makes the structure explicit and auditable. The durable state story is also meaningful for long-running agents in production—you're not rebuilding context from scratch after a process restart.</p>

<p>Requirements: Go 1.22+ for <code>iter.Seq2</code> support and adoption of the graph construction API. Existing ADK 1.x agents are compatible.</p>

<p><strong>Verdict: Evaluate</strong> for existing projects—the migration is non-trivial if you have substantial imperative orchestration code. <strong>Ship</strong> for new multi-agent projects with branching or HITL requirements; there's no good reason to start with ad-hoc orchestration when the graph engine is available.</p>




<p>If this breakdown saved you time sorting signal from noise, <a href="https://tsecurity.de/weiterlesen/3609837/3637976/sonnet-5-launches-opus-performance-at-lower-cost/" target="_blank" rel="noopener noreferrer">Dev Signal</a> lands in your inbox every week with the same format—tools that ship, what they actually change, and whether to act now or wait. Senior engineers only, no beginner explainers.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Building a color replacer: why RGB matching fails on photos and how HSV fixes it]]></title>
<description><![CDATA[I've been building browser-based image tools for a while now, and color replacement is one of those features that seems simple on the surface but hides a lot of interesting problems. I want to write about the main one: why the obvious approach (RGB distance matching) fails on real photos, and how...]]></description>
<link>https://tsecurity.de/de/3637873/sichere-programmierung/building-a-color-replacer-why-rgb-matching-fails-on-photos-and-how-hsv-fixes-it/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3637873/sichere-programmierung/building-a-color-replacer-why-rgb-matching-fails-on-photos-and-how-hsv-fixes-it/</guid>
<pubDate>Wed, 01 Jul 2026 10:43:14 +0200</pubDate>
<content:encoded><![CDATA[<p>I've been building browser-based image tools for a while now, and color replacement is one of those features that seems simple on the surface but hides a lot of interesting problems. I want to write about the main one: why the obvious approach (RGB distance matching) fails on real photos, and how HSV fixes it. Plus some notes on shading preservation, edge detection, and where intelligent scissors fit in.</p>

<h2>
  
  
  Why RGB matching fails on photos
</h2>

<p>When most developers implement "replace this color," the first instinct is something like:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">dist</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">sqrt</span><span class="p">((</span><span class="nx">r</span> <span class="o">-</span> <span class="nx">r0</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="p">(</span><span class="nx">g</span> <span class="o">-</span> <span class="nx">g0</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="p">(</span><span class="nx">b</span> <span class="o">-</span> <span class="nx">b0</span><span class="p">)</span><span class="o">**</span><span class="mi">2</span><span class="p">);</span>
<span class="k">if </span><span class="p">(</span><span class="nx">dist</span> <span class="o">&lt;</span> <span class="nx">threshold</span><span class="p">)</span> <span class="nf">replacePixel</span><span class="p">();</span>
</code></pre>

</div>



<p>This works for flat, uniform colors on a white background. It breaks completely on photos with lighting variation.</p>

<p>The problem is shadows. A red shirt in bright light might have pixels around (220, 40, 40). The same shirt in shadow is more like (80, 15, 15). Both are "red." Their Euclidean distance in RGB space is massive, so either you set a high threshold and accidentally replace dark brown/maroon pixels you didn't want, or you set a low threshold and miss everything in the shadows.</p>

<p>You end up in a losing tradeoff that doesn't resolve cleanly no matter how much you fiddle with the slider.</p>

<h2>
  
  
  Switching to HSV
</h2>

<p>HSV separates the color information (hue) from the brightness (value). That red shirt in shadow still has a hue of around 0 degrees regardless of how dark the pixel is. So you can match on hue with a tight tolerance and not worry about lighting variation at all.</p>

<p>In practice: convert each pixel to HSV, check if the hue falls within N degrees of your target hue AND saturation exceeds a minimum threshold (this excludes near-white and near-gray pixels where hue is essentially undefined). Both conditions met? That's a pixel to replace.</p>

<p>The result on photos is significantly better. Deep shadows and bright highlights of the same hue all get picked up, and the selection boundary follows the actual color rather than the lighting.</p>

<p>One thing that took some iteration: a single "tolerance" slider doesn't work well for HSV. You really want separate H, S, and V tolerance controls. A common case is wanting a tight hue band (only this shade of red, nothing pink or orange) but a wide value tolerance (catch all the dark and light versions of it). Collapsing that into one number forces a tradeoff that's impossible to tune correctly. Three independent sliders is more UI but actually usable.</p>

<h2>
  
  
  Shading preservation
</h2>

<p>Once you correctly identify the pixels to replace, there's a second problem: how do you fill them?</p>

<p>Naive approach: overwrite with the new color's RGB values. This makes it look fake instantly. A red jacket replaced with flat blue loses all the depth. The folds, creases, and fabric texture disappear into a uniform blob.</p>

<p>What actually looks good: replace only the hue component and keep the original pixel's saturation and value. In code:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// target hue comes from the new color</span>
<span class="kd">const</span> <span class="nx">resultH</span> <span class="o">=</span> <span class="nx">targetHSV</span><span class="p">.</span><span class="nx">h</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">resultS</span> <span class="o">=</span> <span class="nx">originalHSV</span><span class="p">.</span><span class="nx">s</span><span class="p">;</span>  <span class="c1">// keep original</span>
<span class="kd">const</span> <span class="nx">resultV</span> <span class="o">=</span> <span class="nx">originalHSV</span><span class="p">.</span><span class="nx">v</span><span class="p">;</span>  <span class="c1">// keep original</span>
</code></pre>

</div>



<p>This preserves all the lighting information: shadows still dark, highlights still bright, texture intact. Only the color itself changes. The output looks like someone actually repainted the object rather than pasted a layer mask over it.</p>

<p>You can add an optional saturation scale on top of this if the new color should be more or less vivid than the original, but the core keep-S-and-V trick does most of the work.</p>

<h2>
  
  
  Polygon selection and edge snapping
</h2>

<p>Global color replace is fine when the background is clearly a different color. But in most real photos, background pixels share hue values with the foreground. You need region selection.</p>

<p>We implemented a polygon selection tool where the user clicks to define a boundary around the area to recolor. That's straightforward. The interesting part is the magnetic lasso behavior: when the user clicks two anchor points, instead of a straight-line segment between them, the path finder uses edge detection to trace along the nearest object boundary.</p>

<p>The edge detection is a Sobel operator, two 3x3 convolution kernels that compute intensity gradients in X and Y, then combined as gradient magnitude. High gradient = edge. These values become the traversal cost for a shortest-path search.</p>

<p>The path finding itself (Livewire / intelligent scissors) is Dijkstra's algorithm on the pixel grid, where traversal cost is inversely proportional to edge strength. Following a strong edge is cheap; cutting across flat regions is expensive. So the algorithm naturally snaps to object boundaries. When it works well (objects with distinct edges against a contrasting background) it feels like the cursor is magnetic, which makes precise selection much faster than clicking every vertex manually.</p>

<h2>
  
  
  Where we shipped this
</h2>

<p>All of this is in a free browser tool at <a href="https://tsecurity.de/weiterlesen/3609734/3637873/building-a-color-replacer-why-rgb-matching-fails-on-photos-and-how-hsv-fixes-it/" target="_blank" rel="noopener noreferrer">https://irrationaltools.com/color-replacer</a>. No uploads, no server processing, everything runs in-browser. There's also support for multiple color pairs in one pass (change red to blue AND green to orange simultaneously), full undo/redo, and zoom up to 10x for pixel-level work.</p>

<p>If you're implementing something similar and have questions on the HSV matching, the Livewire implementation, or anything else in here, happy to dig into it in the comments.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[I expected to hate Enola Holmes 3, but the new Netflix movie and Millie Bobby Brown are incredibly entertaining — despite some laughable flaws]]></title>
<description><![CDATA[Netflix's Sherlock spinoff is three for three in three-star movies. But there's still a looming problem with Enola Holmes 3 that I cannot shake.]]></description>
<link>https://tsecurity.de/de/3637650/it-nachrichten/i-expected-to-hate-enola-holmes-3-but-the-new-netflix-movie-and-millie-bobby-brown-are-incredibly-entertaining-despite-some-laughable-flaws/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3637650/it-nachrichten/i-expected-to-hate-enola-holmes-3-but-the-new-netflix-movie-and-millie-bobby-brown-are-incredibly-entertaining-despite-some-laughable-flaws/</guid>
<pubDate>Wed, 01 Jul 2026 09:02:54 +0200</pubDate>
<content:encoded><![CDATA[Netflix's Sherlock spinoff is three for three in three-star movies. But there's still a looming problem with Enola Holmes 3 that I cannot shake.]]></content:encoded>
</item>
<item>
<title><![CDATA[Anthropic Says U.S. Commerce Lifts Export Controls on Claude Fable 5 and Mythos 5]]></title>
<description><![CDATA[The U.S. Department of Commerce has formally withdrawn export controls on Anthropic’s Claude Fable 5 and Mythos 5 models, ending a three-week standoff triggered by national security concerns over the AI systems. Commerce Secretary Howard Lutnick confirmed the decision in a letter dated June 30, 2...]]></description>
<link>https://tsecurity.de/de/3637577/it-security-nachrichten/anthropic-says-us-commerce-lifts-export-controls-on-claude-fable-5-and-mythos-5/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3637577/it-security-nachrichten/anthropic-says-us-commerce-lifts-export-controls-on-claude-fable-5-and-mythos-5/</guid>
<pubDate>Wed, 01 Jul 2026 08:20:05 +0200</pubDate>
<content:encoded><![CDATA[<p>The U.S. Department of Commerce has formally withdrawn export controls on Anthropic’s Claude Fable 5 and Mythos 5 models, ending a three-week standoff triggered by national security concerns over the AI systems. Commerce Secretary Howard Lutnick confirmed the decision in a letter dated June 30, 2026, addressed to Anthropic’s Chief Compute Officer, Tom Brown. On […]</p>
<p>The post <a href="https://tsecurity.de/weiterlesen/3609438/3637577/anthropic-says-us-commerce-lifts-export-controls-on-claude-fable-5-and-mythos-5/" target="_blank" rel="noopener noreferrer">Anthropic Says U.S. Commerce Lifts Export Controls on Claude Fable 5 and Mythos 5</a> appeared first on <a href="https://tsecurity.de/weiterlesen/3609438/3637577/anthropic-says-us-commerce-lifts-export-controls-on-claude-fable-5-and-mythos-5/" target="_blank" rel="noopener noreferrer">Cyber Security News</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[U.S. Lifts Export Controls on Claude Fable 5 and Mythos 5]]></title>
<description><![CDATA[The U.S. Department of Commerce has formally withdrawn export control restrictions on Anthropic’s Claude Fable 5 and Mythos 5 AI models, ending an 18-day standoff that had blocked global access to the company’s most advanced systems. In a letter dated June 30, 2026, Commerce Secretary Howard Lutn...]]></description>
<link>https://tsecurity.de/de/3637293/it-security-nachrichten/us-lifts-export-controls-on-claude-fable-5-and-mythos-5/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3637293/it-security-nachrichten/us-lifts-export-controls-on-claude-fable-5-and-mythos-5/</guid>
<pubDate>Wed, 01 Jul 2026 05:21:55 +0200</pubDate>
<content:encoded><![CDATA[<p>The U.S. Department of Commerce has formally withdrawn export control restrictions on Anthropic’s Claude Fable 5 and Mythos 5 AI models, ending an 18-day standoff that had blocked global access to the company’s most advanced systems. In a letter dated June 30, 2026, Commerce Secretary Howard Lutnick informed Anthropic’s Chief Compute Officer Tom Brown that […]</p>
<p>The post <a href="https://tsecurity.de/weiterlesen/3609154/3637293/us-lifts-export-controls-on-claude-fable-5-and-mythos-5/" target="_blank" rel="noopener noreferrer">U.S. Lifts Export Controls on Claude Fable 5 and Mythos 5</a> appeared first on <a href="https://tsecurity.de/weiterlesen/3609154/3637293/us-lifts-export-controls-on-claude-fable-5-and-mythos-5/" target="_blank" rel="noopener noreferrer">Cyber Security News</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Creative Commons founders' fireside chat (Creative Commons blog)]]></title>
<description><![CDATA[Dee Harris has published a summary
of the recent "fireside chat" featuring Creative Commons founders Hal
Abelson, Lawrence (Larry) Lessig, Molly Van Houweling, and Glenn Otis
Brown. The chat was to mark the 25th anniversary
of Creative Commons and included a look back at its history as
well as a ...]]></description>
<link>https://tsecurity.de/de/3636519/linux-tipps-hardening/creative-commons-founders-fireside-chat-creative-commons-blog/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3636519/linux-tipps-hardening/creative-commons-founders-fireside-chat-creative-commons-blog/</guid>
<pubDate>Tue, 30 Jun 2026 19:55:26 +0200</pubDate>
<content:encoded><![CDATA[<p>Dee Harris has published a <a href="https://tsecurity.de/weiterlesen/3608380/3636519/creative-commons-founders-fireside-chat-creative-commons-blog/" target="_blank" rel="noopener noreferrer">summary</a>
of the recent "fireside chat" featuring Creative Commons founders Hal
Abelson, Lawrence (Larry) Lessig, Molly Van Houweling, and Glenn Otis
Brown. The chat was to mark the <a href="https://tsecurity.de/weiterlesen/3608380/3636519/creative-commons-founders-fireside-chat-creative-commons-blog/" target="_blank" rel="noopener noreferrer">25th anniversary
of Creative Commons</a> and included a look back at its history as
well as a look at the landscape today:</p>

<blockquote class="bq">
Twenty-five years ago, a small group of people made a bet. They
believed that if you gave creators a simple set of tools and licenses
in language that a lawyer, a machine, and a human could all read,
millions of people might choose to share their work with the world
instead of locking it down.
</blockquote>

<p>The <a href="https://tsecurity.de/weiterlesen/3608380/3636519/creative-commons-founders-fireside-chat-creative-commons-blog/" target="_blank" rel="noopener noreferrer">video</a>
of the chat is available on YouTube.</p>

<p></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[New Leaked iPhone 18 Pro SIM Tray Hints At Dark Cherry Color]]></title>
<description><![CDATA[A fresh leak has given us another look at the possible color choices for the next premium smartphone from Apple. A well-known tipster recently shared an image online showing what appears to be a SIM card tray in a dark cherry shade. This small hardware part lines up perfectly with earlier rumors ...]]></description>
<link>https://tsecurity.de/de/3636517/apple-ios-macos/new-leaked-iphone-18-pro-sim-tray-hints-at-dark-cherry-color/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3636517/apple-ios-macos/new-leaked-iphone-18-pro-sim-tray-hints-at-dark-cherry-color/</guid>
<pubDate>Tue, 30 Jun 2026 19:55:16 +0200</pubDate>
<content:encoded><![CDATA[A fresh leak has given us another look at the possible color choices for the next premium smartphone from Apple. A well-known tipster recently shared an image online showing what appears to be a SIM card tray in a dark cherry shade. This small hardware part lines up perfectly with earlier rumors that the tech giant is working on a rich, dark red finish for the upcoming iPhone 18 Pro models this fall.



A leaked tray confirms the deep red color is coming



The image surfaced on Weibo from a Chinese leaker named Ice Universe. It shows a small tray that looks burgundy, purple, or deep brown, depending on how you see it. This dark cherry shade is expected to be the signature color that the company pushes heavily in 2026. It looks like it will serve as a direct replacement for the Cosmic Orange finish seen on the iPhone 17 Pro.







If you were hoping for a darker, classic look, you might be out of luck. When a user asked the leaker if this new model would come in black, the answer was a simple no. This detail matches older reports suggesting we will not get a black version this year.



Instead, the phone maker plans to offer a few other options. Past information showed the device in light blue, dark gray, and silver. When you combine these with the new red shade, it matches exactly what early dummy units showed about the upcoming lineup.



We should find out the final details in September. That is when the company usually holds its big fall event to announce the next iPhone alongside its highly anticipated first foldable device. With the launch event moving closer, these small hardware leaks give us a very clear picture of exactly what to on store shelves.]]></content:encoded>
</item>
<item>
<title><![CDATA[How to Learn Prompt Engineering — From Crafting One AI to Leading an AI Team]]></title>
<description><![CDATA[How to learn Prompt Engineering? Five core techniques — be clear and specific, assign a role, few-shot examples, chain-of-thought (CoT), structured output. Master these in 1–2 weeks. In 2026, Prompt Engineer is already a high-paying role — top performers earn ¥300K–¥800K RMB annually. Many can tu...]]></description>
<link>https://tsecurity.de/de/3635580/sichere-programmierung/how-to-learn-prompt-engineering-from-crafting-one-ai-to-leading-an-ai-team/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3635580/sichere-programmierung/how-to-learn-prompt-engineering-from-crafting-one-ai-to-leading-an-ai-team/</guid>
<pubDate>Tue, 30 Jun 2026 14:28:42 +0200</pubDate>
<content:encoded><![CDATA[<blockquote>
<p><strong>How to learn Prompt Engineering? Five core techniques — be clear and specific, assign a role, few-shot examples, chain-of-thought (CoT), structured output. Master these in 1–2 weeks. In 2026, Prompt Engineer is already a high-paying role — top performers earn ¥300K–¥800K RMB annually. Many can tune a single prompt to boost their own efficiency; few can orchestrate multi-Agent collaboration to build AI systems. The gap is 5–10x.</strong></p>
</blockquote>




<h2>
  
  
  Principle 1 — Say It Clearly
</h2>

<p>The #1 mistake? Vague requests. AI can't read your mind. The more specific you are, the less it drifts off track.</p>

<p><strong>Bad prompt:</strong> "Write me an article."</p>

<p><strong>Good prompt:</strong> "Write a 1,000-word Python learning roadmap for absolute beginners looking to switch careers. Include: a 3-phase, 6-month timeline, core concepts for each phase, recommended learning resources, and hands-on project suggestions. Use a conversational tone — no academic jargon."</p>

<p>What's the difference? With the first, AI has to guess what you want and will likely deliver something generic and useless. With the second, you've locked in all the key variables — who the reader is, the timeline, what modules to cover, what tone to use — and AI delivers exactly what you asked for. A few tweaks and it's ready to go.</p>

<p><strong>Timeline + scenario + key variables. All three are non-negotiable.</strong></p>




<h2>
  
  
  Principle 2 — Give AI an Identity
</h2>

<p>Assign a role to constrain the output style and depth.</p>

<p>Here's an example: you want AI to draft a trademark infringement warning letter. "Write me a legal letter" — AI gives you a vague, boilerplate template. "You are a senior intellectual property lawyer drafting a trademark infringement cease-and-desist letter for a cross-border e-commerce client. Requirements: cite relevant provisions of the Trademark Law, use formal language but avoid threatening tone, include a 7-day compliance period, and explain the legal consequences of non-compliance. Output in Word document format" — AI delivers a professional letter you can send as-is.</p>

<p>Same request, but with a role vs. without: the output quality gap can be 5–10x. The role determines AI's stance, depth of expertise, and tone — <strong>a role isn't decoration, it's a professional filter for AI's output.</strong></p>




<h2>
  
  
  Principle 3 — Give Examples, Don't Make It Guess
</h2>

<p>Want AI to learn your style? Feed it a few examples.</p>

<p>You want AI to translate slang — give it two examples first: "拍马屁 → brown-nose, 放鸽子 → stand someone up" — then ask it to translate "吃醋" and it outputs "jealous." Without those examples? It might return "be jealous in a relationship" — technically correct, but misses the nuance.</p>

<p>That's what few-shot means: provide 2–3 input-output pairs so AI understands your task pattern. The key: examples should be representative, format-consistent, and cover different cases. Two or three is enough — don't pile on too many, or AI will overfit to your examples and lose flexibility.</p>




<h2>
  
  
  Principle 4 — Make AI Show Its Thinking Process
</h2>

<p>Chain-of-Thought (CoT) is the most effective technique for improving complex task quality.</p>

<p>What does it mean? For complex tasks, don't let AI jump straight to the conclusion — make it write out the reasoning process first.</p>

<p>Say you want AI to analyze an investment report. Don't ask "what do you think of this report?" Ask: "How many sections does this report have? What are the core data sources for each section? What layers of logic should the risk hedging strategy consider? Please outline the framework first, then expand on each item."</p>

<p>Without CoT, AI might skip critical steps and serve up a rough conclusion. With CoT, it reasons step by step, covering every angle — and you can see its judgment basis, making it easy to spot errors.</p>

<p><strong>Making AI "write out its thinking process" is 10x more reliable than "giving the answer directly."</strong></p>




<h2>
  
  
  Principle 5 — Lock Down the Output Format
</h2>

<p>Be explicit about the output format — JSON, Markdown tables, bullet points, numbered lists — to prevent AI from freestyling and scattering your data all over the place.</p>

<p>Here's an example: you want AI to generate a competitive analysis report. "Write a competitive analysis" — AI gives you fluff like "Company X has good products, Company Y also has strengths." "Please output in the following format: 1. Executive summary (under 100 words); 2. Competitive matrix table (columns: product name / company / key differentiator / price / pros &amp; cons); 3. Strategic recommendations (3–5 numbered items)" — AI delivers a structured report you can screenshot and present immediately.</p>




<h2>
  
  
  Application Priority
</h2>

<p>These five techniques aren't equal — there's a clear order:</p>

<p><strong>Clarity and specificity are the foundation</strong> — must be solid, or the other techniques won't work.</p>

<p><strong>Role assignment comes next</strong> — defines AI's stance and depth, highest impact.</p>

<p><strong>Structured output improves readability</strong> — makes results ready to use out of the box.</p>

<p><strong>Few-shot and CoT are situational</strong> — use few-shot when the task pattern is clear, use CoT when reasoning is complex.</p>




<h2>
  
  
  From Crafting One AI to Leading an AI Team
</h2>

<p>The core shift at the advanced level: it's no longer about tuning a single prompt, it's about orchestrating multiple AI Agents to collaborate.</p>

<p>Traditional Prompt Engineering asks "how do I phrase this so one AI gives better output?" 2026 Prompt Engineering asks "how do I define the roles and collaboration rules for multiple AI Agents so they autonomously complete complex tasks?"</p>

<p>On a low-code Agent platform like <a href="https://tsecurity.de/weiterlesen/3607441/3635580/how-to-learn-prompt-engineering-from-crafting-one-ai-to-leading-an-ai-team/" target="_blank" rel="noopener noreferrer">SoloEngine</a>, the workflow looks like this: drag in an intent recognition Agent — "your job is to analyze user input and classify it into four types: order inquiry, refund request, logistics consultation, or complaint"; then drag in a customer service response Agent — "your job is to generate professional, humanized replies based on intent type and knowledge base retrieval results."</p>

<p>A user sends "My package from yesterday hasn't arrived yet" — the intent recognition Agent instantly classifies this as "logistics consultation," the customer service Agent automatically queries the logistics API to track the package location, generates a response, and pushes it to the user. The whole process takes 2 seconds. You just assign tasks and review results.</p>

<p>It's no longer about crafting one AI — it's about leading an entire AI team.</p>

<p>Multi-Agent collaboration introduces three new challenges: <strong>consistency control</strong> — ensuring all Agents share the same style, terminology, and stance, so Agent A doesn't use formal business language while Agent B uses casual internet slang, creating a jarring experience; <strong>boundary definition</strong> — clearly defining each Agent's scope of responsibility, so two Agents don't fight over the same task or ignore it entirely; <strong>handoff protocol</strong> — defining how Agents pass information between each other, such as requiring the intent recognition Agent's output to start with a "type:" label so downstream Agents can parse it accurately.</p>




<h2>
  
  
  My Recommendation
</h2>

<p>How do you learn Prompt Engineering?</p>

<p><strong>Entry level (1–2 weeks):</strong> Master the five techniques — clarity is the foundation, role assignment has the highest impact. Once you nail these, the quality of your AI conversations jumps to a whole new level.</p>

<p><strong>Advanced direction:</strong> Don't keep optimizing single prompts — learn to orchestrate multi-Agent collaboration.</p>

<ul>
<li>
<strong>If you're an individual user:</strong> Start with ChatGPT or Claude, practice the five techniques, turn bad prompts into good ones, and you'll see noticeable improvement in 1–2 weeks.</li>
<li>
<strong>If you want to build AI business systems:</strong> Use <a href="https://tsecurity.de/weiterlesen/3607441/3635580/how-to-learn-prompt-engineering-from-crafting-one-ai-to-leading-an-ai-team/" target="_blank" rel="noopener noreferrer">SoloEngine</a> to orchestrate an Agent team — one person doing the work of an entire department.</li>
</ul>

<p>The ultimate goal isn't "knowing how to write prompts" — it's <strong>using Prompt Engineering to build self-running AI productivity systems</strong>. Master the first, and you can build a single AI assistant. Master the second, and you can build an entire AI business system. That's the critical step from "skill" to "productivity."</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Firmware Black Box: diagnosing embedded resets in the field]]></title>
<description><![CDATA[A device that resets in the field is not always the hardest problem.

The harder problem is a device that resets, comes back online, and leaves no evidence about what happened before the reboot.

That is where a firmware black box becomes useful.


This is the DEV.to edition of a Silicon LogiX te...]]></description>
<link>https://tsecurity.de/de/3635104/sichere-programmierung/firmware-black-box-diagnosing-embedded-resets-in-the-field/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3635104/sichere-programmierung/firmware-black-box-diagnosing-embedded-resets-in-the-field/</guid>
<pubDate>Tue, 30 Jun 2026 11:42:04 +0200</pubDate>
<content:encoded><![CDATA[<p>A device that resets in the field is not always the hardest problem.</p>

<p>The harder problem is a device that resets, comes back online, and leaves no evidence about what happened before the reboot.</p>

<p>That is where a firmware black box becomes useful.</p>

<blockquote>
<p>This is the DEV.to edition of a Silicon LogiX technical article. The canonical English source is linked at the end.</p>
</blockquote>

<h2>
  
  
  What a firmware black box is
</h2>

<p>A firmware black box is a small diagnostic subsystem inside the firmware. Its job is to preserve enough information to support post-mortem analysis after a reset, watchdog event, HardFault, panic or unexpected reboot.</p>

<p>It does not need to record everything. It needs to record the data that helps answer the first diagnostic questions:</p>

<ul>
<li>why did the device reset?</li>
<li>how long had it been running?</li>
<li>which firmware build was installed?</li>
<li>what state was the application in?</li>
<li>which task was active?</li>
<li>did the watchdog fire?</li>
<li>did memory, stack or heap margins collapse?</li>
<li>did the network, modem, BLE, Wi-Fi or OTA flow fail just before the reboot?</li>
</ul>

<p>Without that data, every field reset deletes most of the evidence.</p>

<h2>
  
  
  Why sporadic resets are expensive
</h2>

<p>Rare embedded bugs are often more expensive than obvious failures.</p>

<p>A crash that happens every time in the same function can usually be analyzed with a debugger, logs and a repeatable test. A reset that appears once every ten days on a customer device is different.</p>

<p>The cause may depend on a combination of:</p>

<ul>
<li>temperature</li>
<li>unstable power</li>
<li>brown-out</li>
<li>cable length</li>
<li>enclosure heating</li>
<li>network drops</li>
<li>modem state</li>
<li>memory fragmentation</li>
<li>stack exhaustion</li>
<li>long uptime</li>
<li>race conditions</li>
<li>a peripheral that stops responding</li>
<li>an OTA edge case</li>
</ul>

<p>In the lab, the product may look clean. In the field, the environment changes. The customer report often becomes: "it rebooted", "it stopped communicating", or "we had to power-cycle it".</p>

<p>That is not enough for firmware diagnosis.</p>

<h2>
  
  
  What to capture
</h2>

<p>A good first version does not need to be large. Start with a compact structure that survives the next boot:</p>

<ul>
<li>reset reason</li>
<li>uptime before reset</li>
<li>firmware version and build ID</li>
<li>hardware variant</li>
<li>application state</li>
<li>last meaningful error</li>
<li>watchdog counters</li>
<li>recent application events</li>
<li>active RTOS task</li>
<li>stack high-water marks</li>
<li>minimum heap</li>
<li>OTA state</li>
<li>network state</li>
<li>fault registers or core dump when available</li>
</ul>

<p>For FreeRTOS systems, values such as <code>uxTaskGetStackHighWaterMark</code> can be extremely useful when stack margins are suspected.</p>

<p>For Cortex-M systems, fault status registers, stack pointer information and the program counter can turn a blind HardFault into a useful post-mortem report.</p>

<p>For ESP32 products, ESP-IDF already provides useful mechanisms such as panic handling and core dump. The best design often combines those built-in tools with application-level event history and upload after reboot.</p>

<h2>
  
  
  Watchdog is not enough
</h2>

<p>The watchdog is essential. It can recover service when firmware stops responding.</p>

<p>But if the watchdog resets the system and nothing is stored, the device is operational again while the root cause has disappeared.</p>

<p>A good watchdog restarts the device.</p>

<p>A good firmware black box explains why the restart was necessary.</p>

<p>Useful questions include:</p>

<ul>
<li>which task failed to report health?</li>
<li>was the device reconnecting to the cloud?</li>
<li>was the modem stuck?</li>
<li>was heap decreasing over time?</li>
<li>was an OTA update in progress?</li>
<li>were there repeated DNS, TLS, MQTT or BLE errors?</li>
</ul>

<p>This is the difference between recovery and diagnosis.</p>

<h2>
  
  
  Logging and diagnostics are different
</h2>

<p>Many firmware projects have logs. That does not mean they are diagnosable.</p>

<p>UART logs are useful during development, but they often disappear in production. If nobody had a terminal connected when the customer device reset, those logs are gone.</p>

<p>Diagnostics should be designed for field conditions:</p>

<ul>
<li>no debugger attached</li>
<li>no serial cable connected</li>
<li>no engineer present at the crash</li>
<li>limited memory</li>
<li>possible power loss</li>
<li>possible network failure</li>
<li>support team needs a readable report</li>
</ul>

<p>A compact persistent ring buffer with the latest important events may be more valuable than thousands of UART lines that nobody will ever see.</p>

<h2>
  
  
  Storage options
</h2>

<p>The right storage depends on the product:</p>

<ul>
<li>retention RAM for fast data across software resets</li>
<li>internal flash for small critical reports</li>
<li>NVS or a dedicated partition on ESP32</li>
<li>EEPROM or FRAM for frequent diagnostic counters</li>
<li>local filesystem on embedded Linux gateways</li>
<li>cloud upload after reboot for connected devices</li>
</ul>

<p>Do not make the cloud the only source of truth. The network may be part of the problem.</p>

<p>Also be careful with flash wear, power loss during writes, atomic updates and sensitive data. Diagnostic reports should not contain passwords, private keys, tokens or unnecessary personal data.</p>

<h2>
  
  
  A practical checklist
</h2>

<p>Before shipping a connected embedded product, ask:</p>

<ul>
<li>[ ] Is reset reason collected at boot?</li>
<li>[ ] Are watchdog, brown-out, software reset and manual reset distinguished?</li>
<li>[ ] Is firmware version tied to a build ID or commit?</li>
<li>[ ] Is hardware variant recorded?</li>
<li>[ ] Is there a useful HardFault or panic strategy?</li>
<li>[ ] Are RTOS task health and stack margins observable?</li>
<li>[ ] Is minimum heap recorded?</li>
<li>[ ] Is there a persistent event ring buffer?</li>
<li>[ ] Are network and OTA events included?</li>
<li>[ ] Can support export a report without JTAG?</li>
<li>[ ] Are sensitive data and credentials excluded?</li>
</ul>

<h2>
  
  
  Typical field scenario
</h2>

<p>Imagine an STM32 or ESP32 controller. It passes lab tests, talks to sensors, sends data to the cloud and supports OTA. The watchdog is enabled, so the team feels safe.</p>

<p>After release, some customers report random reboots.</p>

<p>Without a black box, the team guesses: maybe the modem, maybe a task stack, maybe power, maybe memory, maybe I2C, maybe Wi-Fi.</p>

<p>With a black box, the next episode can produce a report:</p>

<ul>
<li>watchdog reset</li>
<li>uptime: 91 hours</li>
<li>application state: MQTT reconnect</li>
<li>network task stack almost exhausted</li>
<li>several DNS timeouts in the recent event buffer</li>
<li>firmware build ID identified</li>
</ul>

<p>That is not the final fix, but it is a direction. In embedded debugging, a direction can save days or weeks.</p>

<h2>
  
  
  Final takeaway
</h2>

<p>A firmware black box is not an extra feature for perfectionists. It is part of building maintainable embedded products.</p>

<p>A device in the field should not only recover. It should explain what happened.</p>

<p>When diagnostics are designed with reset reason, watchdog analysis, fault context, RTOS metrics, persistent events, OTA state and safe export, sporadic resets stop being mysterious and become measurable.</p>

<p>And a measurable problem is much closer to a fix.</p>




<p>Canonical source: <a href="https://tsecurity.de/weiterlesen/3606965/3635104/firmware-black-box-diagnosing-embedded-resets-in-the-field/" target="_blank" rel="noopener noreferrer">Firmware Black Box: how to find out why an embedded device resets in the field</a></p>

<p>If you build embedded, IoT or firmware products and want a second pair of eyes on diagnostics, watchdog strategy, OTA behavior or field failures, Silicon LogiX can help turn hard-to-reproduce issues into measurable engineering work.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[How I Built a Real-Time Audio Visualizer with the Web Audio API]]></title>
<description><![CDATA[What is a browser-based audio visualizer?


A browser-based audio visualizer is a real-time graphical display that converts live audio signals into visual patterns — waveforms, frequency spectrums, or spectrograms — using the Web Audio API and HTML5 Canvas, entirely on the client side with zero s...]]></description>
<link>https://tsecurity.de/de/3632801/sichere-programmierung/how-i-built-a-real-time-audio-visualizer-with-the-web-audio-api/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3632801/sichere-programmierung/how-i-built-a-real-time-audio-visualizer-with-the-web-audio-api/</guid>
<pubDate>Mon, 29 Jun 2026 13:57:53 +0200</pubDate>
<content:encoded><![CDATA[<h2>
  
  
  What is a browser-based audio visualizer?
</h2>

<p>A browser-based audio visualizer is a real-time graphical display that converts live audio signals into visual patterns — waveforms, frequency spectrums, or spectrograms — using the <strong>Web Audio API</strong> and <strong>HTML5 Canvas</strong>, entirely on the client side with zero server processing.</p>

<p>I built <a href="https://tsecurity.de/weiterlesen/3604662/3632801/how-i-built-a-real-time-audio-visualizer-with-the-web-audio-api/" target="_blank" rel="noopener noreferrer">Octaveview</a>, a free, professional-grade online tone generator that includes four visualization modes: <strong>Waveform (Oscilloscope)</strong>, <strong>Spectrum Analyzer</strong>, <strong>Dual View</strong>, and <strong>Heatmap Spectrogram</strong>. In this article, I'll walk through the core architecture and techniques I used.</p>




<h2>
  
  
  The Web Audio API Architecture
</h2>

<p>The Web Audio API uses a <strong>node graph</strong> model. You connect audio nodes together in a chain, from a source to a destination (your speakers). Here's the simplified signal flow I used:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>OscillatorNode → GainNode → StereoPannerNode → AnalyserNode → AudioDestination
</code></pre>

</div>



<h3>
  
  
  Step 1: Create the Audio Context and Oscillator
</h3>

<p>The <code>AudioContext</code> is the entry point for all Web Audio operations. The <code>OscillatorNode</code> generates periodic waveforms (sine, square, sawtooth, triangle) at a specified frequency.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">audioCtx</span> <span class="o">=</span> <span class="k">new </span><span class="p">(</span><span class="nb">window</span><span class="p">.</span><span class="nx">AudioContext</span> <span class="o">||</span> <span class="nb">window</span><span class="p">.</span><span class="nx">webkitAudioContext</span><span class="p">)();</span>
<span class="kd">const</span> <span class="nx">oscillator</span> <span class="o">=</span> <span class="nx">audioCtx</span><span class="p">.</span><span class="nf">createOscillator</span><span class="p">();</span>

<span class="nx">oscillator</span><span class="p">.</span><span class="nx">type</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">sine</span><span class="dl">'</span><span class="p">;</span> <span class="c1">// Options: 'sine', 'square', 'sawtooth', 'triangle'</span>
<span class="nx">oscillator</span><span class="p">.</span><span class="nx">frequency</span><span class="p">.</span><span class="nf">setValueAtTime</span><span class="p">(</span><span class="mi">440</span><span class="p">,</span> <span class="nx">audioCtx</span><span class="p">.</span><span class="nx">currentTime</span><span class="p">);</span> <span class="c1">// A4 = 440 Hz</span>
</code></pre>

</div>



<h3>
  
  
  Step 2: Add Gain (Volume) and Panning Controls
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">gainNode</span> <span class="o">=</span> <span class="nx">audioCtx</span><span class="p">.</span><span class="nf">createGain</span><span class="p">();</span>
<span class="nx">gainNode</span><span class="p">.</span><span class="nx">gain</span><span class="p">.</span><span class="nf">setValueAtTime</span><span class="p">(</span><span class="mf">0.5</span><span class="p">,</span> <span class="nx">audioCtx</span><span class="p">.</span><span class="nx">currentTime</span><span class="p">);</span> <span class="c1">// 50% volume</span>

<span class="kd">const</span> <span class="nx">pannerNode</span> <span class="o">=</span> <span class="nx">audioCtx</span><span class="p">.</span><span class="nf">createStereoPanner</span><span class="p">();</span>
<span class="nx">pannerNode</span><span class="p">.</span><span class="nx">pan</span><span class="p">.</span><span class="nf">setValueAtTime</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">audioCtx</span><span class="p">.</span><span class="nx">currentTime</span><span class="p">);</span> <span class="c1">// Center</span>
</code></pre>

</div>



<h3>
  
  
  Step 3: Connect the AnalyserNode for Visualization
</h3>

<p>The <code>AnalyserNode</code> is the key to real-time visualization. It performs a Fast Fourier Transform (FFT) on the audio signal, giving you both time-domain (waveform) and frequency-domain (spectrum) data.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">analyser</span> <span class="o">=</span> <span class="nx">audioCtx</span><span class="p">.</span><span class="nf">createAnalyser</span><span class="p">();</span>
<span class="nx">analyser</span><span class="p">.</span><span class="nx">fftSize</span> <span class="o">=</span> <span class="mi">2048</span><span class="p">;</span> <span class="c1">// Higher = more frequency resolution</span>

<span class="c1">// Connect the signal chain</span>
<span class="nx">oscillator</span><span class="p">.</span><span class="nf">connect</span><span class="p">(</span><span class="nx">gainNode</span><span class="p">);</span>
<span class="nx">gainNode</span><span class="p">.</span><span class="nf">connect</span><span class="p">(</span><span class="nx">pannerNode</span><span class="p">);</span>
<span class="nx">pannerNode</span><span class="p">.</span><span class="nf">connect</span><span class="p">(</span><span class="nx">analyser</span><span class="p">);</span>
<span class="nx">analyser</span><span class="p">.</span><span class="nf">connect</span><span class="p">(</span><span class="nx">audioCtx</span><span class="p">.</span><span class="nx">destination</span><span class="p">);</span>
</code></pre>

</div>



<h3>
  
  
  Step 4: Render the Waveform on Canvas
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">const</span> <span class="nx">canvas</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">getElementById</span><span class="p">(</span><span class="dl">'</span><span class="s1">viz-canvas</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">ctx</span> <span class="o">=</span> <span class="nx">canvas</span><span class="p">.</span><span class="nf">getContext</span><span class="p">(</span><span class="dl">'</span><span class="s1">2d</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">bufferLength</span> <span class="o">=</span> <span class="nx">analyser</span><span class="p">.</span><span class="nx">frequencyBinCount</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">dataArray</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Uint8Array</span><span class="p">(</span><span class="nx">bufferLength</span><span class="p">);</span>

<span class="kd">function</span> <span class="nf">drawWaveform</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">requestAnimationFrame</span><span class="p">(</span><span class="nx">drawWaveform</span><span class="p">);</span>
  <span class="nx">analyser</span><span class="p">.</span><span class="nf">getByteTimeDomainData</span><span class="p">(</span><span class="nx">dataArray</span><span class="p">);</span>

  <span class="nx">ctx</span><span class="p">.</span><span class="nx">fillStyle</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">#0a0b14</span><span class="dl">'</span><span class="p">;</span>
  <span class="nx">ctx</span><span class="p">.</span><span class="nf">fillRect</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">height</span><span class="p">);</span>

  <span class="nx">ctx</span><span class="p">.</span><span class="nx">lineWidth</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
  <span class="nx">ctx</span><span class="p">.</span><span class="nx">strokeStyle</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">#00e5ff</span><span class="dl">'</span><span class="p">;</span> <span class="c1">// Cyan accent</span>
  <span class="nx">ctx</span><span class="p">.</span><span class="nf">beginPath</span><span class="p">();</span>

  <span class="kd">const</span> <span class="nx">sliceWidth</span> <span class="o">=</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="nx">bufferLength</span><span class="p">;</span>
  <span class="kd">let</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

  <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">bufferLength</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">v</span> <span class="o">=</span> <span class="nx">dataArray</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">/</span> <span class="mf">128.0</span><span class="p">;</span>
    <span class="kd">const</span> <span class="nx">y</span> <span class="o">=</span> <span class="p">(</span><span class="nx">v</span> <span class="o">*</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">height</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>

    <span class="k">if </span><span class="p">(</span><span class="nx">i</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="nx">ctx</span><span class="p">.</span><span class="nf">moveTo</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">);</span>
    <span class="k">else</span> <span class="nx">ctx</span><span class="p">.</span><span class="nf">lineTo</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">);</span>

    <span class="nx">x</span> <span class="o">+=</span> <span class="nx">sliceWidth</span><span class="p">;</span>
  <span class="p">}</span>

  <span class="nx">ctx</span><span class="p">.</span><span class="nf">lineTo</span><span class="p">(</span><span class="nx">canvas</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">height</span> <span class="o">/</span> <span class="mi">2</span><span class="p">);</span>
  <span class="nx">ctx</span><span class="p">.</span><span class="nf">stroke</span><span class="p">();</span>
<span class="p">}</span>

<span class="nf">drawWaveform</span><span class="p">();</span>
</code></pre>

</div>



<h3>
  
  
  Step 5: Render the Spectrum Analyzer
</h3>

<p>For the frequency spectrum, use <code>getByteFrequencyData()</code> instead:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">function</span> <span class="nf">drawSpectrum</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">requestAnimationFrame</span><span class="p">(</span><span class="nx">drawSpectrum</span><span class="p">);</span>
  <span class="nx">analyser</span><span class="p">.</span><span class="nf">getByteFrequencyData</span><span class="p">(</span><span class="nx">dataArray</span><span class="p">);</span>

  <span class="nx">ctx</span><span class="p">.</span><span class="nx">fillStyle</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">#0a0b14</span><span class="dl">'</span><span class="p">;</span>
  <span class="nx">ctx</span><span class="p">.</span><span class="nf">fillRect</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">width</span><span class="p">,</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">height</span><span class="p">);</span>

  <span class="kd">const</span> <span class="nx">barWidth</span> <span class="o">=</span> <span class="p">(</span><span class="nx">canvas</span><span class="p">.</span><span class="nx">width</span> <span class="o">/</span> <span class="nx">bufferLength</span><span class="p">)</span> <span class="o">*</span> <span class="mf">2.5</span><span class="p">;</span>
  <span class="kd">let</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

  <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">bufferLength</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">barHeight</span> <span class="o">=</span> <span class="nx">dataArray</span><span class="p">[</span><span class="nx">i</span><span class="p">];</span>

    <span class="c1">// Gradient from cyan to purple based on amplitude</span>
    <span class="kd">const</span> <span class="nx">hue</span> <span class="o">=</span> <span class="mi">180</span> <span class="o">+</span> <span class="p">(</span><span class="nx">barHeight</span> <span class="o">/</span> <span class="mi">255</span><span class="p">)</span> <span class="o">*</span> <span class="mi">100</span><span class="p">;</span>
    <span class="nx">ctx</span><span class="p">.</span><span class="nx">fillStyle</span> <span class="o">=</span> <span class="s2">`hsl(</span><span class="p">${</span><span class="nx">hue</span><span class="p">}</span><span class="s2">, 100%, 50%)`</span><span class="p">;</span>
    <span class="nx">ctx</span><span class="p">.</span><span class="nf">fillRect</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">canvas</span><span class="p">.</span><span class="nx">height</span> <span class="o">-</span> <span class="nx">barHeight</span><span class="p">,</span> <span class="nx">barWidth</span><span class="p">,</span> <span class="nx">barHeight</span><span class="p">);</span>

    <span class="nx">x</span> <span class="o">+=</span> <span class="nx">barWidth</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre>

</div>






<h2>
  
  
  Adding Colored Noise Generators
</h2>

<p>Beyond periodic waveforms, I added <strong>white</strong>, <strong>pink</strong>, and <strong>brown noise</strong> using <code>AudioBuffer</code> with custom-generated random samples:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">function</span> <span class="nf">createWhiteNoise</span><span class="p">(</span><span class="nx">audioCtx</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">bufferSize</span> <span class="o">=</span> <span class="nx">audioCtx</span><span class="p">.</span><span class="nx">sampleRate</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span>
  <span class="kd">const</span> <span class="nx">buffer</span> <span class="o">=</span> <span class="nx">audioCtx</span><span class="p">.</span><span class="nf">createBuffer</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">bufferSize</span><span class="p">,</span> <span class="nx">audioCtx</span><span class="p">.</span><span class="nx">sampleRate</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">data</span> <span class="o">=</span> <span class="nx">buffer</span><span class="p">.</span><span class="nf">getChannelData</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>

  <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">bufferSize</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">data</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">*</span> <span class="mi">2</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// Random values between -1 and 1</span>
  <span class="p">}</span>

  <span class="kd">const</span> <span class="nx">source</span> <span class="o">=</span> <span class="nx">audioCtx</span><span class="p">.</span><span class="nf">createBufferSource</span><span class="p">();</span>
  <span class="nx">source</span><span class="p">.</span><span class="nx">buffer</span> <span class="o">=</span> <span class="nx">buffer</span><span class="p">;</span>
  <span class="nx">source</span><span class="p">.</span><span class="nx">loop</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
  <span class="k">return</span> <span class="nx">source</span><span class="p">;</span>
<span class="p">}</span>
</code></pre>

</div>



<ul>
<li>
<strong>White noise</strong> has equal energy per frequency (flat spectrum).</li>
<li>
<strong>Pink noise</strong> has equal energy per octave — it sounds more natural and is used for speaker calibration.</li>
<li>
<strong>Brown noise</strong> rolls off at 6 dB/octave, producing a deep rumble ideal for sleep and relaxation.</li>
</ul>




<h2>
  
  
  ADSR Envelope for Natural Sound Shaping
</h2>

<p>To prevent harsh clicks and create musically natural sounds, I implemented an <strong>ADSR (Attack, Decay, Sustain, Release)</strong> volume envelope:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="kd">function</span> <span class="nf">applyADSR</span><span class="p">(</span><span class="nx">gainNode</span><span class="p">,</span> <span class="nx">audioCtx</span><span class="p">,</span> <span class="p">{</span> <span class="nx">attack</span><span class="p">,</span> <span class="nx">decay</span><span class="p">,</span> <span class="nx">sustain</span><span class="p">,</span> <span class="nx">release</span> <span class="p">})</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">now</span> <span class="o">=</span> <span class="nx">audioCtx</span><span class="p">.</span><span class="nx">currentTime</span><span class="p">;</span>
  <span class="nx">gainNode</span><span class="p">.</span><span class="nx">gain</span><span class="p">.</span><span class="nf">cancelScheduledValues</span><span class="p">(</span><span class="nx">now</span><span class="p">);</span>
  <span class="nx">gainNode</span><span class="p">.</span><span class="nx">gain</span><span class="p">.</span><span class="nf">setValueAtTime</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nx">now</span><span class="p">);</span>
  <span class="nx">gainNode</span><span class="p">.</span><span class="nx">gain</span><span class="p">.</span><span class="nf">linearRampToValueAtTime</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nx">now</span> <span class="o">+</span> <span class="nx">attack</span><span class="p">);</span>         <span class="c1">// Attack</span>
  <span class="nx">gainNode</span><span class="p">.</span><span class="nx">gain</span><span class="p">.</span><span class="nf">linearRampToValueAtTime</span><span class="p">(</span><span class="nx">sustain</span><span class="p">,</span> <span class="nx">now</span> <span class="o">+</span> <span class="nx">attack</span> <span class="o">+</span> <span class="nx">decay</span><span class="p">);</span> <span class="c1">// Decay → Sustain</span>
<span class="p">}</span>
</code></pre>

</div>






<h2>
  
  
  Key Takeaways
</h2>

<ol>
<li>The <strong>Web Audio API</strong> is incredibly powerful for real-time audio synthesis and analysis without any plugins or server dependencies.</li>
<li>The <code>AnalyserNode</code> with FFT gives you both time-domain and frequency-domain data for rich visualizations.</li>
<li>Custom <code>AudioBuffer</code> nodes let you generate any sound algorithmically — noise, custom waveforms, or even sampled instruments.</li>
<li>Client-side audio generation means <strong>zero latency</strong>, <strong>full offline support</strong>, and <strong>complete user privacy</strong>.</li>
</ol>




<h2>
  
  
  Try It Live
</h2>

<p>You can try all of these features — waveform visualization, spectrum analyzer, ADSR envelopes, noise generators, and WAV export — for free at <strong><a href="https://tsecurity.de/weiterlesen/3604662/3632801/how-i-built-a-real-time-audio-visualizer-with-the-web-audio-api/" target="_blank" rel="noopener noreferrer">Octaveview</a></strong>.</p>

<p>For binaural beats with independent left/right ear frequency control, check out the <strong><a href="https://tsecurity.de/weiterlesen/3604662/3632801/how-i-built-a-real-time-audio-visualizer-with-the-web-audio-api/" target="_blank" rel="noopener noreferrer">Binaural Beats Studio</a></strong>.</p>




<p><em>Built with vanilla JavaScript, the Web Audio API, HTML5 Canvas, and Astro. No frameworks, no dependencies, no tracking.</em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Trade-off: The First Word I Was Told to Carry for Life]]></title>
<description><![CDATA[Before I understood what engineering was, a professor handed me a word to look up in a dictionary. I've been using it ever since.

A look back — long before any of the tools we argue about now.


  
  
  Engineering, before I knew the word


In Korea, boys in middle school took a subject simply c...]]></description>
<link>https://tsecurity.de/de/3631999/sichere-programmierung/trade-off-the-first-word-i-was-told-to-carry-for-life/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3631999/sichere-programmierung/trade-off-the-first-word-i-was-told-to-carry-for-life/</guid>
<pubDate>Mon, 29 Jun 2026 07:28:24 +0200</pubDate>
<content:encoded><![CDATA[<p><strong>Before I understood what engineering was, a professor handed me a word to look up in a dictionary. I've been using it ever since.</strong></p>

<p><em>A look back — long before any of the tools we argue about now.</em></p>

<h3>
  
  
  Engineering, before I knew the word
</h3>

<p>In Korea, boys in middle school took a subject simply called "Technology," and high schools offered an elective called "Industrial Arts." Mine taught "Commerce" instead — so my entire pre-college image of engineering came down to a screwdriver, a few nails, and an AM radio kit I'd soldered together. No Lego that I can recall, but I remember playing with science kits, and blowing my allowance on Academy plastic models. The closest thing to "advanced study" was learning to read resistor values off their color bands — black, brown, red, orange, yellow, green, blue, violet, gray, white. That was the whole of my hardware education.</p>

<p>I walked into a computer engineering department without ever really asking myself what engineering was. What I noticed first, honestly, was the gender ratio: about one in ten classmates was a woman, which — after six years in all-boys middle and high schools — was its own small culture shock. Having women as classmates and seniors at all felt like news.</p>

<h3>
  
  
  The first word
</h3>

<p>Our first major course was "Introduction to Computer Engineering," which in practice meant learning C. We could finally touch the machines at school; you did your homework in Turbo C and handed it in on a floppy.</p>

<p>I can't forget Professor Sang Lyul Min, one of the second class our department ever graduated. One day he said, "Let me give you a few fundamental words you'll need for the rest of your life." The first was <em>trade-off</em>. This was before the internet was something you could just search, so I went home and dug it out of a Korean–English dictionary, like a piece of slang I'd never heard.</p>

<p>From that one word I learned three things at once: that there's no free lunch; that this is exactly where engineering parts ways from science; and why the comparison with mathematics would keep coming back. The further I went into my career — and the more decisions I had to actually own — the more that word kept surfacing.</p>

<h3>
  
  
  The word that kept coming back
</h3>

<p>It showed up in my algorithms course, the moment we started weighing time complexity against space complexity. It showed up again and again as I began reading papers, as a way of making sense of the world. If someone asked me today what engineering is — or made me pick a single word for it — I wouldn't hesitate.</p>

<p>I'd say: <em>trade-off</em>.</p>




<p><em>Adapted from my Korean essay on Brunch: <a href="https://tsecurity.de/weiterlesen/3603860/3631999/trade-off-the-first-word-i-was-told-to-carry-for-life/" target="_blank" rel="noopener noreferrer">brunch.co.kr/@chaesang/32</a></em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[KI-Betrug an Brown: Professor fordert offenen Streit über Prüfungen]]></title>
<description><![CDATA[PROVIDENCE / LONDON (IT BOLTWISE) – An der Brown University deckt ein Professor mutmaßlich KI-gestützten Betrug bei einer Mathematik-Ökonomie-Klausur auf. In den Ergebnissen der ersten Prüfung sticht eine ungewöhnlich hohe Erfolgsquote hervor, die später durch eine Vor-Ort-Prüfung deutlich einbri...]]></description>
<link>https://tsecurity.de/de/3631949/it-security-nachrichten/ki-betrug-an-brown-professor-fordert-offenen-streit-ueber-pruefungen/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3631949/it-security-nachrichten/ki-betrug-an-brown-professor-fordert-offenen-streit-ueber-pruefungen/</guid>
<pubDate>Mon, 29 Jun 2026 06:53:20 +0200</pubDate>
<content:encoded><![CDATA[<p><img width="1024" height="1024" src="https://www.it-boltwise.de/wp-content/uploads/2026/06/ai-ki-betrug-brown-exam-proctoring.jpg" class="attachment- size- wp-post-image" alt="" decoding="async" fetchpriority="high" srcset="https://www.it-boltwise.de/wp-content/uploads/2026/06/ai-ki-betrug-brown-exam-proctoring.jpg 1024w, https://www.it-boltwise.de/wp-content/uploads/2026/06/ai-ki-betrug-brown-exam-proctoring-300x300.jpg 300w, https://www.it-boltwise.de/wp-content/uploads/2026/06/ai-ki-betrug-brown-exam-proctoring-150x150.jpg 150w, https://www.it-boltwise.de/wp-content/uploads/2026/06/ai-ki-betrug-brown-exam-proctoring-768x768.jpg 768w, https://www.it-boltwise.de/wp-content/uploads/2026/06/ai-ki-betrug-brown-exam-proctoring-840x840.jpg 840w, https://www.it-boltwise.de/wp-content/uploads/2026/06/ai-ki-betrug-brown-exam-proctoring-120x120.jpg 120w" sizes="(max-width: 1024px) 100vw, 1024px">PROVIDENCE / LONDON (IT BOLTWISE) – An der Brown University deckt ein Professor mutmaßlich KI-gestützten Betrug bei einer Mathematik-Ökonomie-Klausur auf. In den Ergebnissen der ersten Prüfung sticht eine ungewöhnlich hohe Erfolgsquote hervor, die später durch eine Vor-Ort-Prüfung deutlich einbricht. Der Ökonom Roberto Serrano fordert, dass die Universität den Ernst der Lage öffentlich anerkennt und eine […]</p>
<div><a href="https://tsecurity.de/weiterlesen/3603810/3631949/ki-betrug-an-brown-professor-fordert-offenen-streit-ueber-pruefungen/" target="_blank" rel="noopener noreferrer">... den vollständigen Artikel <strong>»KI-Betrug an Brown: Professor fordert offenen Streit über Prüfungen«</strong> lesen</a></div>
<p>Dieser Beitrag <a href="https://tsecurity.de/weiterlesen/3603810/3631949/ki-betrug-an-brown-professor-fordert-offenen-streit-ueber-pruefungen/" target="_blank" rel="noopener noreferrer">KI-Betrug an Brown: Professor fordert offenen Streit über Prüfungen</a> erschien als erstes auf <a href="https://tsecurity.de/weiterlesen/3603810/3631949/ki-betrug-an-brown-professor-fordert-offenen-streit-ueber-pruefungen/" target="_blank" rel="noopener noreferrer">IT BOLTWISE x Artificial Intelligence</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Circuit Breaker and Bulkhead Thresholds You Can Tune Live (Kiponos Java SDK)]]></title>
<description><![CDATA[Circuit breakers and bulkheads are design patterns — their numbers are operational weapons. Failure ratio 50% or 30%? Max concurrent calls 25 or 100? During an outage the right answer changes hourly. Code the pattern once; tune thresholds live.

Kiponos.io separates resilience structure (in Java)...]]></description>
<link>https://tsecurity.de/de/3631713/sichere-programmierung/circuit-breaker-and-bulkhead-thresholds-you-can-tune-live-kiponos-java-sdk/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3631713/sichere-programmierung/circuit-breaker-and-bulkhead-thresholds-you-can-tune-live-kiponos-java-sdk/</guid>
<pubDate>Mon, 29 Jun 2026 02:27:21 +0200</pubDate>
<content:encoded><![CDATA[<p>Circuit breakers and bulkheads are <strong>design patterns</strong> — their <strong>numbers</strong> are operational weapons. Failure ratio 50% or 30%? Max concurrent calls 25 or 100? During an outage the right answer changes <strong>hourly</strong>. Code the pattern once; <strong>tune thresholds live</strong>.</p>

<p><a href="https://tsecurity.de/weiterlesen/3603574/3631713/circuit-breaker-and-bulkhead-thresholds-you-can-tune-live-kiponos-java-sdk/" target="_blank" rel="noopener noreferrer">Kiponos.io</a> separates <strong>resilience structure</strong> (in Java) from <strong>resilience parameters</strong> (in live config tree).</p>

<h2>
  
  
  Pattern in code, numbers in Kiponos
</h2>



<div class="highlight js-code-highlight">
<pre class="highlight java"><code><span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">allowCall</span><span class="o">(</span><span class="nc">String</span> <span class="n">downstream</span><span class="o">)</span> <span class="o">{</span>
    <span class="kt">var</span> <span class="n">cfg</span> <span class="o">=</span> <span class="n">kiponos</span><span class="o">.</span><span class="na">path</span><span class="o">(</span><span class="s">"resilience"</span><span class="o">,</span> <span class="n">downstream</span><span class="o">);</span>
    <span class="k">return</span> <span class="nf">breaker</span><span class="o">(</span><span class="n">downstream</span><span class="o">)</span>
        <span class="o">.</span><span class="na">failureRateThreshold</span><span class="o">(</span><span class="n">cfg</span><span class="o">.</span><span class="na">getFloat</span><span class="o">(</span><span class="s">"failure_rate_threshold"</span><span class="o">))</span>
        <span class="o">.</span><span class="na">waitDurationInOpenState</span><span class="o">(</span><span class="n">cfg</span><span class="o">.</span><span class="na">getInt</span><span class="o">(</span><span class="s">"open_seconds"</span><span class="o">))</span>
        <span class="o">.</span><span class="na">permittedInHalfOpen</span><span class="o">(</span><span class="n">cfg</span><span class="o">.</span><span class="na">getInt</span><span class="o">(</span><span class="s">"half_open_calls"</span><span class="o">))</span>
        <span class="o">.</span><span class="na">tryAcquire</span><span class="o">();</span>
<span class="o">}</span>
</code></pre>

</div>



<p>Ops opens circuit sensitivity during brownout — dashboard edit, not redeploy.</p>

<h2>
  
  
  Resilience tree
</h2>



<div class="highlight js-code-highlight">
<pre class="highlight yaml"><code><span class="s">resilience/</span>
  <span class="s">payments-api/</span>
    <span class="s">failure_rate_threshold</span><span class="err">:</span> <span class="m">0.5</span>
    <span class="na">open_seconds</span><span class="pi">:</span> <span class="m">30</span>
    <span class="na">half_open_calls</span><span class="pi">:</span> <span class="m">5</span>
    <span class="na">bulkhead_max_concurrent</span><span class="pi">:</span> <span class="m">40</span>
<span class="err">  </span><span class="s">inventory-api/</span>
    <span class="s">failure_rate_threshold</span><span class="err">:</span> <span class="m">0.35</span>
    <span class="na">open_seconds</span><span class="pi">:</span> <span class="m">60</span>
    <span class="na">bulkhead_max_concurrent</span><span class="pi">:</span> <span class="m">25</span>
<span class="err">  </span><span class="s">global/</span>
    <span class="s">force_open_all</span><span class="err">:</span> <span class="kc">false</span>
</code></pre>

</div>



<h2>
  
  
  Extreme: coordinated degradation
</h2>

<p>Platform SRE sets <code>force_open_all: false</code> normally. During regional disaster, flip selective <code>open_seconds</code> sky-high on non-critical downstreams — <strong>bulkhead by configuration</strong>, Java still executes pattern logic.</p>

<h2>
  
  
  Performance
</h2>

<p>Breaker checks are per-call — <code>getFloat()</code> <strong>must</strong> be local. See <a href="https://tsecurity.de/weiterlesen/3603574/3631713/circuit-breaker-and-bulkhead-thresholds-you-can-tune-live-kiponos-java-sdk/" target="_blank" rel="noopener noreferrer">rate limits article</a>.</p>

<h2>
  
  
  Getting started
</h2>

<ol>
<li>Externalize Resilience4j YAML values to <code>resilience/*</code>
</li>
<li>Incident drill: tighten <code>failure_rate_threshold</code> live</li>
</ol>

<p>Resources: <a href="https://tsecurity.de/weiterlesen/3603574/3631713/circuit-breaker-and-bulkhead-thresholds-you-can-tune-live-kiponos-java-sdk/" target="_blank" rel="noopener noreferrer">github.com/kiponos-io/kiponos-io</a></p>




<p><em>Kiponos.io — resilience patterns with live numbers. Breakers that bend during the outage.</em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Meet Cozy Café]]></title>
<description><![CDATA[Part 2: Meet Cozy Café (and Give Your Bot a Backbone)


Part 2 of a beginner-friendly series on building a real Discord bot with JavaScript, discord.js, and Prisma. Part 1 got a bot online and replying to /ping. Today we reveal what we're actually building — and lay the foundation for it.

Welcom...]]></description>
<link>https://tsecurity.de/de/3631626/sichere-programmierung/meet-cozy-caf/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3631626/sichere-programmierung/meet-cozy-caf/</guid>
<pubDate>Mon, 29 Jun 2026 00:27:46 +0200</pubDate>
<content:encoded><![CDATA[<h2>
  
  
  Part 2: Meet Cozy Café (and Give Your Bot a Backbone)
</h2>

<p><em>Part 2 of a beginner-friendly series on building a real Discord bot with JavaScript, discord.js, and Prisma. Part 1 got a bot online and replying to <code>/ping</code>. Today we reveal what we're actually building — and lay the foundation for it.</em></p>

<p>Welcome back! In Part 1 you did something genuinely cool: you built a program that logs into Discord and answers a <code>/ping</code> command with <code>Pong!</code>. That's the entire skeleton of every Discord bot ever made — listen for an event, react to it.</p>

<p>But <code>/ping</code> is a bit lonely. So in this part, two things happen. First, <strong>the big reveal</strong>: I'll show you the actual project we're building across this series. Second, we'll <strong>give your bot a backbone</strong> — a tidy structure that lets it grow from one command to dozens without turning into an unreadable mess — and write the first two real commands of our game.</p>

<p>Let's meet the café.</p>




<h2>
  
  
  The reveal: we're building Cozy Café ☕
</h2>

<p>Here's the project: <strong>Cozy Café — an idle café game you run entirely from inside Discord.</strong></p>

<p>You open a little café with a slash command. From then on, your café quietly serves customers and earns coins <strong>in real time — even while you're offline.</strong> You drop back in whenever you feel like it to collect your earnings, spend them on upgrades and new recipes, and slowly master your menu. Over time a humble coffee cart grows into a cozy corner the whole server knows.</p>

<p>That's it. No twitch reflexes, no grinding, no pressure. Just a warm little thing that's <em>yours</em> and is always gently ticking along in the background.</p>

<h3>
  
  
  What a moment of play feels like
</h3>

<p>You open Discord in the morning, type <code>/collect</code>, and your bot replies:</p>

<blockquote>
<p>☕ <strong>While you were away (9h 12m)</strong> your café served <strong>74 customers</strong> and earned <strong>184 coins.</strong><br>
You also discovered a new recipe: <strong>Cinnamon Roll</strong> — add it to your menu with <code>/menu</code>.</p>
</blockquote>

<p>You spend thirty seconds deciding what to do — upgrade your espresso machine so you earn faster, or save up for that Matcha Latte you've been eyeing — then close Discord and get on with your day. The whole visit takes a minute, and it's completely optional.</p>

<h3>
  
  
  Why <em>this</em> game? (the design philosophy)
</h3>

<p>This is the part I really want you to understand, because it's a deliberate design choice, not an accident. You might know the feeling of a game or app that <em>punishes</em> you for not showing up — a streak you'll lose, a pet that starves, daily quests that pile up into guilt. That's the opposite of cozy.</p>

<p>Cozy Café is built on one rule:</p>

<blockquote>
<p><strong>Reward presence, never punish absence.</strong></p>
</blockquote>

<p>Everything follows from that sentence:</p>

<ul>
<li>Your café earns while you're away, so checking in once a day feels rewarding — there's always something waiting to collect.</li>
<li>But earnings cap out at about a day's worth, so you never <em>need</em> to check more than once a day. No compulsive refreshing.</li>
<li>And nothing ever decays. Skip three days, skip a week — your coins, recipes, and progress are all exactly where you left them. You just collect a full batch when you're back.</li>
</ul>

<p>The thing that keeps pulling you back isn't fear of losing progress — it's the quiet satisfaction of <strong>collecting and mastering</strong>: filling out a recipe book, leveling up your favourite drinks, watching your café grow. A carrot, never a stick.</p>

<p>That's the game. Now let's build the foundation it needs.</p>




<h2>
  
  
  Why we can't just keep piling code into one file
</h2>

<p>In Part 1, everything lived in a single <code>index.js</code>. That was perfect for one command. But look at where we're heading: <code>/open</code>, <code>/cafe</code>, <code>/collect</code>, <code>/daily</code>, <code>/shop</code>, <code>/recipes</code>, <code>/menu</code>… If we cram all of those into <code>index.js</code>, we'll end up with a 600-line monster where everything is tangled together and finding anything is a nightmare.</p>

<p>So before we add features, we're going to reorganize. This is a habit real developers live by, and the "why" behind it has a name: <strong>separation of concerns.</strong> The idea is simple — <em>each piece of your program should have one clear job and live in one obvious place.</em> When every command is its own little file, you always know exactly where to look, and adding a new command never risks breaking an old one.</p>

<p>Here's the structure we're building toward:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>cozy-cafe-bot/
├─ commands/
│  ├─ open.js        ← one file per command
│  └─ cafe.js
├─ data/
│  └─ store.js       ← where café data lives (for now)
├─ .env              ← your secrets (from Part 1)
├─ deploy-commands.js
└─ index.js          ← the "brain" that ties it together
</code></pre>

</div>



<p><em>(That top folder is simply your project from Part 1. I've named it <code>cozy-cafe-bot/</code> here, but the name honestly doesn't matter — keep <code>my-discord-bot</code> from Part 1 if you like. Only the files and folders **inside</em>* it matter.)*</p>

<p>The trick that makes this work is a <strong>command handler</strong>: a small bit of code in <code>index.js</code> that automatically <em>finds</em> every file in the <code>commands/</code> folder and loads it. Add a new command file, and the bot just picks it up — you never have to manually wire each one in. Let's build it.</p>




<h2>
  
  
  Step 1 — Give every command a consistent shape
</h2>

<p>The handler can only auto-load our commands if they all look the same on the outside. So we'll agree on a simple <strong>contract</strong>: every command file exports an object with exactly two things —</p>

<ul>
<li>
<code>data</code> — the command's name and description (built with <code>SlashCommandBuilder</code>, same as Part 1).</li>
<li>
<code>execute</code> — the function that runs when someone uses the command.</li>
</ul>

<p>That's the whole contract. <code>{ data, execute }</code>. Once every command follows it, the handler can treat them all identically, without caring what any individual command actually does. That consistency is what makes the magic possible.</p>




<h2>
  
  
  Step 2 — A place to keep café data (just for today)
</h2>

<p>Our commands need somewhere to store each player's café. For this part, we'll use the simplest storage that exists: a <strong><code>Map</code></strong> held in the bot's memory.</p>

<blockquote>
<p>A <code>Map</code> is a built-in JavaScript container that stores key → value pairs. We'll use each player's Discord user ID as the key, and their café as the value — so we can look up "the café belonging to <em>this</em> person."</p>
</blockquote>

<p>Create a folder called <code>data</code>, and inside it a file <code>store.js</code>:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// data/store.js</span>

<span class="c1">// A simple in-memory store: Discord user ID  -&gt;  that user's café.</span>
<span class="c1">// ⚠️ Heads up: this lives in the bot's memory (RAM), which means it is</span>
<span class="c1">// wiped clean every time the bot restarts. We'll fix that in Part 3.</span>
<span class="kd">const</span> <span class="nx">cafes</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Map</span><span class="p">();</span>

<span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">cafes</span> <span class="p">};</span>
</code></pre>

</div>



<p>Why put this in its own file? Because <strong>both</strong> of our commands (<code>/open</code> and <code>/cafe</code>) need to read and write the <em>same</em> café data. By keeping the <code>Map</code> in one shared module, every file that imports it gets the exact same <code>Map</code> — when <code>/open</code> adds a café, <code>/cafe</code> can immediately see it. (Node.js loads a module once and reuses it everywhere, which is exactly the behaviour we want here.)</p>

<p>That warning in the comment is the whole point of this part, by the way. Keep it in mind — we'll come back to it.</p>




<h2>
  
  
  Step 3 — The first command: <code>/open</code>
</h2>

<p>Create <code>commands/open.js</code>:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// commands/open.js</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">SlashCommandBuilder</span><span class="p">,</span> <span class="nx">EmbedBuilder</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">discord.js</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">cafes</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">../data/store.js</span><span class="dl">'</span><span class="p">);</span>

<span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span>
  <span class="c1">// The "data" half of our contract — name + description</span>
  <span class="na">data</span><span class="p">:</span> <span class="k">new</span> <span class="nc">SlashCommandBuilder</span><span class="p">()</span>
    <span class="p">.</span><span class="nf">setName</span><span class="p">(</span><span class="dl">'</span><span class="s1">open</span><span class="dl">'</span><span class="p">)</span>
    <span class="p">.</span><span class="nf">setDescription</span><span class="p">(</span><span class="dl">'</span><span class="s1">Open your very own café!</span><span class="dl">'</span><span class="p">),</span>

  <span class="c1">// The "execute" half — what actually happens</span>
  <span class="k">async</span> <span class="nf">execute</span><span class="p">(</span><span class="nx">interaction</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">userId</span> <span class="o">=</span> <span class="nx">interaction</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>

    <span class="c1">// Do they already have a café?</span>
    <span class="k">if </span><span class="p">(</span><span class="nx">cafes</span><span class="p">.</span><span class="nf">has</span><span class="p">(</span><span class="nx">userId</span><span class="p">))</span> <span class="p">{</span>
      <span class="k">await</span> <span class="nx">interaction</span><span class="p">.</span><span class="nf">reply</span><span class="p">(</span><span class="dl">'</span><span class="s1">You already run a café! Check on it with `/cafe`.</span><span class="dl">'</span><span class="p">);</span>
      <span class="k">return</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="c1">// Create a brand-new café for this player</span>
    <span class="kd">const</span> <span class="nx">cafe</span> <span class="o">=</span> <span class="p">{</span>
      <span class="na">name</span><span class="p">:</span> <span class="s2">`</span><span class="p">${</span><span class="nx">interaction</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">username</span><span class="p">}</span><span class="s2">'s Café`</span><span class="p">,</span>
      <span class="na">coins</span><span class="p">:</span> <span class="mi">50</span><span class="p">,</span>            <span class="c1">// a little starting cash</span>
      <span class="na">level</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
      <span class="na">openedAt</span><span class="p">:</span> <span class="nb">Date</span><span class="p">.</span><span class="nf">now</span><span class="p">(),</span> <span class="c1">// we'll use this timestamp properly in Part 3</span>
    <span class="p">};</span>
    <span class="nx">cafes</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">userId</span><span class="p">,</span> <span class="nx">cafe</span><span class="p">);</span>

    <span class="c1">// Reply with a nice-looking embed instead of plain text</span>
    <span class="kd">const</span> <span class="nx">embed</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">EmbedBuilder</span><span class="p">()</span>
      <span class="p">.</span><span class="nf">setColor</span><span class="p">(</span><span class="mh">0xc5774a</span><span class="p">)</span>
      <span class="p">.</span><span class="nf">setTitle</span><span class="p">(</span><span class="dl">'</span><span class="s1">☕ Your café is now open!</span><span class="dl">'</span><span class="p">)</span>
      <span class="p">.</span><span class="nf">setDescription</span><span class="p">(</span><span class="s2">`Welcome to **</span><span class="p">${</span><span class="nx">cafe</span><span class="p">.</span><span class="nx">name</span><span class="p">}</span><span class="s2">**. Grab an apron — let's get brewing.`</span><span class="p">)</span>
      <span class="p">.</span><span class="nf">addFields</span><span class="p">(</span>
        <span class="p">{</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Coins</span><span class="dl">'</span><span class="p">,</span> <span class="na">value</span><span class="p">:</span> <span class="s2">`</span><span class="p">${</span><span class="nx">cafe</span><span class="p">.</span><span class="nx">coins</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span> <span class="na">inline</span><span class="p">:</span> <span class="kc">true</span> <span class="p">},</span>
        <span class="p">{</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Level</span><span class="dl">'</span><span class="p">,</span> <span class="na">value</span><span class="p">:</span> <span class="s2">`</span><span class="p">${</span><span class="nx">cafe</span><span class="p">.</span><span class="nx">level</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span> <span class="na">inline</span><span class="p">:</span> <span class="kc">true</span> <span class="p">},</span>
      <span class="p">)</span>
      <span class="p">.</span><span class="nf">setFooter</span><span class="p">({</span> <span class="na">text</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Check on your café anytime with /cafe</span><span class="dl">'</span> <span class="p">});</span>

    <span class="k">await</span> <span class="nx">interaction</span><span class="p">.</span><span class="nf">reply</span><span class="p">({</span> <span class="na">embeds</span><span class="p">:</span> <span class="p">[</span><span class="nx">embed</span><span class="p">]</span> <span class="p">});</span>
  <span class="p">},</span>
<span class="p">};</span>
</code></pre>

</div>



<p>A few things worth understanding here:</p>

<ul>
<li>
<strong><code>interaction.user.id</code></strong> is Discord's unique ID for whoever ran the command. Using it as our key means each person gets their <em>own</em> café — your café and your friend's café never get mixed up.</li>
<li>
<strong>The "already have one?" check</strong> is a small but important habit: think about what happens if someone runs a command twice. Here, we politely stop instead of wiping out their existing café.</li>
<li>
<strong><code>EmbedBuilder</code></strong> creates those tidy, bordered message cards you've seen fancy bots use. It's purely about presentation — <code>setTitle</code>, <code>setDescription</code>, <code>addFields</code> — but it instantly makes your bot feel polished instead of plain. (<code>0xc5774a</code> is a warm coffee-brown colour, written in hex.)</li>
</ul>




<h2>
  
  
  Step 4 — The second command: <code>/cafe</code>
</h2>

<p>Create <code>commands/cafe.js</code>:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// commands/cafe.js</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">SlashCommandBuilder</span><span class="p">,</span> <span class="nx">EmbedBuilder</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">discord.js</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">cafes</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">../data/store.js</span><span class="dl">'</span><span class="p">);</span>

<span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">data</span><span class="p">:</span> <span class="k">new</span> <span class="nc">SlashCommandBuilder</span><span class="p">()</span>
    <span class="p">.</span><span class="nf">setName</span><span class="p">(</span><span class="dl">'</span><span class="s1">cafe</span><span class="dl">'</span><span class="p">)</span>
    <span class="p">.</span><span class="nf">setDescription</span><span class="p">(</span><span class="dl">'</span><span class="s1">Check in on your café.</span><span class="dl">'</span><span class="p">),</span>

  <span class="k">async</span> <span class="nf">execute</span><span class="p">(</span><span class="nx">interaction</span><span class="p">)</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">cafe</span> <span class="o">=</span> <span class="nx">cafes</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="nx">interaction</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>

    <span class="c1">// No café yet? Point them to /open.</span>
    <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">cafe</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">await</span> <span class="nx">interaction</span><span class="p">.</span><span class="nf">reply</span><span class="p">(</span><span class="dl">"</span><span class="s2">You don't have a café yet! Open one with `/open`.</span><span class="dl">"</span><span class="p">);</span>
      <span class="k">return</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="kd">const</span> <span class="nx">embed</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">EmbedBuilder</span><span class="p">()</span>
      <span class="p">.</span><span class="nf">setColor</span><span class="p">(</span><span class="mh">0xc5774a</span><span class="p">)</span>
      <span class="p">.</span><span class="nf">setTitle</span><span class="p">(</span><span class="s2">`☕ </span><span class="p">${</span><span class="nx">cafe</span><span class="p">.</span><span class="nx">name</span><span class="p">}</span><span class="s2">`</span><span class="p">)</span>
      <span class="p">.</span><span class="nf">addFields</span><span class="p">(</span>
        <span class="p">{</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Coins</span><span class="dl">'</span><span class="p">,</span> <span class="na">value</span><span class="p">:</span> <span class="s2">`</span><span class="p">${</span><span class="nx">cafe</span><span class="p">.</span><span class="nx">coins</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span> <span class="na">inline</span><span class="p">:</span> <span class="kc">true</span> <span class="p">},</span>
        <span class="p">{</span> <span class="na">name</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Level</span><span class="dl">'</span><span class="p">,</span> <span class="na">value</span><span class="p">:</span> <span class="s2">`</span><span class="p">${</span><span class="nx">cafe</span><span class="p">.</span><span class="nx">level</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span> <span class="na">inline</span><span class="p">:</span> <span class="kc">true</span> <span class="p">},</span>
      <span class="p">)</span>
      <span class="p">.</span><span class="nf">setFooter</span><span class="p">({</span> <span class="na">text</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Coming soon: collect earnings, unlock recipes…</span><span class="dl">'</span> <span class="p">});</span>

    <span class="k">await</span> <span class="nx">interaction</span><span class="p">.</span><span class="nf">reply</span><span class="p">({</span> <span class="na">embeds</span><span class="p">:</span> <span class="p">[</span><span class="nx">embed</span><span class="p">]</span> <span class="p">});</span>
  <span class="p">},</span>
<span class="p">};</span>
</code></pre>

</div>



<p>Notice how this command <em>only reads</em> the café — it looks one up with <code>cafes.get(...)</code> and shows it. The matching pattern to <code>/open</code>'s <code>cafes.set(...)</code>. Read and write, sharing the same <code>Map</code>. That symmetry is the payoff for putting our store in its own file.</p>




<h2>
  
  
  Step 5 — The command handler that ties it all together
</h2>

<p>Now we upgrade <code>index.js</code> so it automatically loads everything in <code>commands/</code> and routes each slash command to the right file. Replace your <code>index.js</code> with this:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// index.js</span>
<span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">dotenv</span><span class="dl">'</span><span class="p">).</span><span class="nf">config</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">node:fs</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">path</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">node:path</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">Client</span><span class="p">,</span> <span class="nx">Collection</span><span class="p">,</span> <span class="nx">Events</span><span class="p">,</span> <span class="nx">GatewayIntentBits</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">discord.js</span><span class="dl">'</span><span class="p">);</span>

<span class="kd">const</span> <span class="nx">client</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Client</span><span class="p">({</span> <span class="na">intents</span><span class="p">:</span> <span class="p">[</span><span class="nx">GatewayIntentBits</span><span class="p">.</span><span class="nx">Guilds</span><span class="p">]</span> <span class="p">});</span>

<span class="c1">// --- 1. Load every command file into a collection ---</span>
<span class="nx">client</span><span class="p">.</span><span class="nx">commands</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Collection</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">commandsPath</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="dl">'</span><span class="s1">commands</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">commandFiles</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">.</span><span class="nf">readdirSync</span><span class="p">(</span><span class="nx">commandsPath</span><span class="p">).</span><span class="nf">filter</span><span class="p">((</span><span class="nx">file</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">file</span><span class="p">.</span><span class="nf">endsWith</span><span class="p">(</span><span class="dl">'</span><span class="s1">.js</span><span class="dl">'</span><span class="p">));</span>

<span class="k">for </span><span class="p">(</span><span class="kd">const</span> <span class="nx">file</span> <span class="k">of</span> <span class="nx">commandFiles</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">command</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="nx">commandsPath</span><span class="p">,</span> <span class="nx">file</span><span class="p">));</span>
  <span class="k">if </span><span class="p">(</span><span class="dl">'</span><span class="s1">data</span><span class="dl">'</span> <span class="k">in</span> <span class="nx">command</span> <span class="o">&amp;&amp;</span> <span class="dl">'</span><span class="s1">execute</span><span class="dl">'</span> <span class="k">in</span> <span class="nx">command</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">client</span><span class="p">.</span><span class="nx">commands</span><span class="p">.</span><span class="nf">set</span><span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nx">name</span><span class="p">,</span> <span class="nx">command</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`⚠️  Skipping </span><span class="p">${</span><span class="nx">file</span><span class="p">}</span><span class="s2">: missing "data" or "execute".`</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="c1">// --- 2. Say hello when the bot connects ---</span>
<span class="nx">client</span><span class="p">.</span><span class="nf">once</span><span class="p">(</span><span class="nx">Events</span><span class="p">.</span><span class="nx">ClientReady</span><span class="p">,</span> <span class="p">(</span><span class="nx">c</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`✅ Logged in as </span><span class="p">${</span><span class="nx">c</span><span class="p">.</span><span class="nx">user</span><span class="p">.</span><span class="nx">tag</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
<span class="p">});</span>

<span class="c1">// --- 3. Run the matching command whenever someone uses a slash command ---</span>
<span class="nx">client</span><span class="p">.</span><span class="nf">on</span><span class="p">(</span><span class="nx">Events</span><span class="p">.</span><span class="nx">InteractionCreate</span><span class="p">,</span> <span class="k">async </span><span class="p">(</span><span class="nx">interaction</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">interaction</span><span class="p">.</span><span class="nf">isChatInputCommand</span><span class="p">())</span> <span class="k">return</span><span class="p">;</span>

  <span class="kd">const</span> <span class="nx">command</span> <span class="o">=</span> <span class="nx">client</span><span class="p">.</span><span class="nx">commands</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="nx">interaction</span><span class="p">.</span><span class="nx">commandName</span><span class="p">);</span>
  <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">command</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>

  <span class="k">try</span> <span class="p">{</span>
    <span class="k">await</span> <span class="nx">command</span><span class="p">.</span><span class="nf">execute</span><span class="p">(</span><span class="nx">interaction</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">catch </span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="nx">error</span><span class="p">);</span>
    <span class="k">await</span> <span class="nx">interaction</span><span class="p">.</span><span class="nf">reply</span><span class="p">(</span><span class="dl">'</span><span class="s1">Something went wrong running that command. 😬</span><span class="dl">'</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">});</span>

<span class="nx">client</span><span class="p">.</span><span class="nf">login</span><span class="p">(</span><span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">DISCORD_TOKEN</span><span class="p">);</span>
</code></pre>

</div>



<p>This is the heart of Part 2, so let's unpack the three numbered sections:</p>

<ol>
<li><p><strong>Loading the commands.</strong> <code>fs.readdirSync</code> reads the <code>commands/</code> folder and gives us a list of filenames; we keep only the <code>.js</code> ones. For each, we <code>require</code> it (that runs the file and hands us its <code>{ data, execute }</code> object) and store it in a <strong><code>Collection</code></strong> — discord.js's souped-up version of a <code>Map</code> — keyed by the command's name. The little check makes sure we only load files that honour our contract. The beautiful part: <strong>drop a new file into <code>commands/</code> and it's automatically loaded.</strong> You never edit this section again.</p></li>
<li><p><strong>The ready event</strong> is unchanged from Part 1 — still using the future-proof <code>Events.ClientReady</code>.</p></li>
<li><p><strong>Dispatching.</strong> When a slash command comes in, we look up the matching command by name (<code>client.commands.get(...)</code>) and call its <code>execute</code>. The <code>try/catch</code> is a safety net: if a command crashes, we log the real error for ourselves and show the user a friendly message instead of the bot silently dying.</p></li>
</ol>

<p>See how the handler doesn't know or care that <code>/open</code> makes a café and <code>/cafe</code> shows one? It just finds commands and runs them. <em>That's</em> separation of concerns paying off.</p>




<h2>
  
  
  Step 6 — Tell Discord about the new commands
</h2>

<p>Slash commands have to be registered with Discord before they appear (remember this from Part 1?). We'll make our <code>deploy-commands.js</code> read the <code>commands/</code> folder too, so it always stays in sync. Replace it with:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight javascript"><code><span class="c1">// deploy-commands.js</span>
<span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">dotenv</span><span class="dl">'</span><span class="p">).</span><span class="nf">config</span><span class="p">();</span>
<span class="kd">const</span> <span class="nx">fs</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">node:fs</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">path</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">node:path</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">REST</span><span class="p">,</span> <span class="nx">Routes</span> <span class="p">}</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="dl">'</span><span class="s1">discord.js</span><span class="dl">'</span><span class="p">);</span>

<span class="kd">const</span> <span class="nx">commands</span> <span class="o">=</span> <span class="p">[];</span>
<span class="kd">const</span> <span class="nx">commandsPath</span> <span class="o">=</span> <span class="nx">path</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="nx">__dirname</span><span class="p">,</span> <span class="dl">'</span><span class="s1">commands</span><span class="dl">'</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">commandFiles</span> <span class="o">=</span> <span class="nx">fs</span><span class="p">.</span><span class="nf">readdirSync</span><span class="p">(</span><span class="nx">commandsPath</span><span class="p">).</span><span class="nf">filter</span><span class="p">((</span><span class="nx">file</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">file</span><span class="p">.</span><span class="nf">endsWith</span><span class="p">(</span><span class="dl">'</span><span class="s1">.js</span><span class="dl">'</span><span class="p">));</span>

<span class="k">for </span><span class="p">(</span><span class="kd">const</span> <span class="nx">file</span> <span class="k">of</span> <span class="nx">commandFiles</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">command</span> <span class="o">=</span> <span class="nf">require</span><span class="p">(</span><span class="nx">path</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="nx">commandsPath</span><span class="p">,</span> <span class="nx">file</span><span class="p">));</span>
  <span class="k">if </span><span class="p">(</span><span class="dl">'</span><span class="s1">data</span><span class="dl">'</span> <span class="k">in</span> <span class="nx">command</span> <span class="o">&amp;&amp;</span> <span class="dl">'</span><span class="s1">execute</span><span class="dl">'</span> <span class="k">in</span> <span class="nx">command</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">commands</span><span class="p">.</span><span class="nf">push</span><span class="p">(</span><span class="nx">command</span><span class="p">.</span><span class="nx">data</span><span class="p">.</span><span class="nf">toJSON</span><span class="p">());</span> <span class="c1">// convert to the format Discord wants</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="kd">const</span> <span class="nx">rest</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">REST</span><span class="p">().</span><span class="nf">setToken</span><span class="p">(</span><span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">DISCORD_TOKEN</span><span class="p">);</span>

<span class="p">(</span><span class="k">async </span><span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="k">try</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Registering </span><span class="p">${</span><span class="nx">commands</span><span class="p">.</span><span class="nx">length</span><span class="p">}</span><span class="s2"> command(s)…`</span><span class="p">);</span>
    <span class="k">await</span> <span class="nx">rest</span><span class="p">.</span><span class="nf">put</span><span class="p">(</span>
      <span class="nx">Routes</span><span class="p">.</span><span class="nf">applicationGuildCommands</span><span class="p">(</span><span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">CLIENT_ID</span><span class="p">,</span> <span class="nx">process</span><span class="p">.</span><span class="nx">env</span><span class="p">.</span><span class="nx">GUILD_ID</span><span class="p">),</span>
      <span class="p">{</span> <span class="na">body</span><span class="p">:</span> <span class="nx">commands</span> <span class="p">},</span>
    <span class="p">);</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">'</span><span class="s1">✅ Commands registered!</span><span class="dl">'</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">catch </span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="nx">error</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">})();</span>
</code></pre>

</div>



<p>It's the same idea as the handler: walk the folder, collect each command's <code>data</code>, and send the batch to Discord. Run it now:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>node deploy-commands.js
</code></pre>

</div>



<p>You should see <code>Registering 2 command(s)…</code> then <code>✅ Commands registered!</code>. (Re-run this script whenever you <em>add or rename</em> a command — not every time you start the bot.)</p>




<h2>
  
  
  Step 7 — Run it and open your café
</h2>

<p>Start the bot:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>node index.js
</code></pre>

</div>



<p>Over in your test server, type <code>/open</code>. Your bot welcomes you with a warm embed and your café springs to life. Now type <code>/cafe</code> — there it is, coins and all. Run <code>/open</code> again and it politely tells you that you already have one.</p>

<p>You just played the first thirty seconds of Cozy Café. 🎉</p>




<h2>
  
  
  The catch (and it's on purpose)
</h2>

<p>Now do this little experiment. With the bot running and your café open, go back to your terminal, press <strong>Ctrl + C</strong> to stop the bot, then start it again with <code>node index.js</code>. Hop back to Discord and type <code>/cafe</code>.</p>

<blockquote>
<p>You don't have a café yet! Open one with <code>/open</code>.</p>
</blockquote>

<p>Gone. Your café vanished. 😟</p>

<p>This isn't a bug — it's the lesson. Remember that warning we wrote in <code>store.js</code>? Our <code>Map</code> lives in the bot's <strong>memory (RAM)</strong>, and memory is <em>temporary</em> — the moment the program stops, everything in it evaporates. This is exactly the cliffhanger Part 1 ended on: <strong>a bot, on its own, has no lasting memory.</strong></p>

<p>And here's why it matters so much for <em>this</em> game specifically. Cozy Café's whole magic trick — "while you were away for 9 hours you earned 184 coins" — depends on the bot reliably remembering two things between visits: your café's state, and <em>when you last collected</em>. An idle game that forgets everything on restart isn't an idle game at all. So our game doesn't just <em>want</em> permanent memory; it literally <strong>cannot exist</strong> without it.</p>

<p>That's our cue.</p>




<h2>
  
  
  What you built, and what's next
</h2>

<p>Look at how far you came in this part:</p>

<ul>
<li>You learned what we're building and <em>why</em> it's designed the way it is — <strong>reward presence, never punish absence.</strong>
</li>
<li>You gave your bot a real backbone: a <code>commands/</code> folder, a consistent <code>{ data, execute }</code> contract, and a handler that auto-loads everything. Your bot can now grow to dozens of commands without becoming a mess.</li>
<li>You wrote <code>/open</code> and <code>/cafe</code>, your first real game commands, complete with polished embeds.</li>
<li>And you <em>felt</em>, first-hand, the problem that defines the next chapter.</li>
</ul>

<p>In <strong>Part 3</strong>, we give Cozy Café a permanent memory. We'll introduce a real database and meet <strong>Prisma</strong> — the friendly tool that lets us save and load café data with clean, readable JavaScript. That <code>store.js</code> <code>Map</code> will become a real <code>Cafe</code> table, your cafés will survive restarts, and we'll finally write <code>/collect</code> with genuine "earn while you're away" math powered by that <code>openedAt</code> timestamp we quietly planted today.</p>

<h3>
  
  
  Try it yourself before Part 3
</h3>

<p>The best way to make this stick is to tinker. A few gentle challenges:</p>

<ul>
<li>Change the welcome message or the café's starting coins in <code>open.js</code>.</li>
<li>Add a fun fact to the <code>/cafe</code> embed — maybe show how long ago the café opened (hint: compare <code>Date.now()</code> to the <code>openedAt</code> you stored).</li>
<li>Bolder: create a brand-new command file, <code>commands/rename.js</code>, that lets a player rename their café. If you follow the <code>{ data, execute }</code> contract, the handler will pick it up automatically — no wiring required. (That's the whole point!)</li>
</ul>

<p>Break things, fix them, make the café yours. See you in Part 3, where it finally remembers. ☕</p>




<p><em>Enjoying the series? Part 3 builds directly on the project you just structured, so keep this folder handy.</em></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[How to render chess diagrams in Node.js (no DOM, no canvas, no headless browser)]]></title>
<description><![CDATA[If you've ever needed to generate a chess diagram programmatically — for a blog, a PDF report, or a static site — you've probably hit the same wall I did.

Most solutions require either a browser environment, a headless Chromium instance, or a canvas polyfill that pulls in half of npm. For someth...]]></description>
<link>https://tsecurity.de/de/3631265/sichere-programmierung/how-to-render-chess-diagrams-in-nodejs-no-dom-no-canvas-no-headless-browser/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3631265/sichere-programmierung/how-to-render-chess-diagrams-in-nodejs-no-dom-no-canvas-no-headless-browser/</guid>
<pubDate>Sun, 28 Jun 2026 18:26:33 +0200</pubDate>
<content:encoded><![CDATA[<p>If you've ever needed to generate a chess diagram programmatically — for a blog, a PDF report, or a static site — you've probably hit the same wall I did.</p>

<p>Most solutions require either a browser environment, a headless Chromium instance, or a canvas polyfill that pulls in half of npm. For something as simple as "turn a FEN string into an image," that's a lot of overhead.</p>

<p>So I extracted the rendering core from my chess editor into a standalone package: <code>@chessvision-org/chess-vision</code>. Zero dependencies. Works in Node.js, Deno, Bun, and the browser. No DOM, no canvas, no network calls.</p>

<h2>
  
  
  The basics
</h2>



<div class="highlight js-code-highlight">
<pre class="highlight shell"><code>npm <span class="nb">install</span> @chessvision-org/chess-vision
</code></pre>

</div>





<div class="highlight js-code-highlight">
<pre class="highlight typescript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">generateDiagram</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@chessvision-org/chess-vision</span><span class="dl">'</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">svg</span> <span class="o">=</span> <span class="nf">generateDiagram</span><span class="p">({</span>
  <span class="na">fen</span><span class="p">:</span> <span class="dl">'</span><span class="s1">rnbqkbnr/pppppppp/8/8/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 0 1</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">size</span><span class="p">:</span> <span class="mi">400</span><span class="p">,</span>
  <span class="na">showCoords</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
<span class="p">});</span>
</code></pre>

</div>



<p><code>svg</code> is a self-contained SVG string — inline it in HTML, write it to a file, embed it in a PDF. Pieces are inlined as SVG paths (CBurnett / Lichess style), so no external resources are needed.</p>

<p><code>generateDiagram</code> throws if the FEN string is invalid. Validate first if you're working with untrusted input:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight typescript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">generateDiagram</span><span class="p">,</span> <span class="nx">validateFEN</span><span class="p">,</span> <span class="nx">getFENValidationError</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@chessvision-org/chess-vision</span><span class="dl">'</span><span class="p">;</span>

<span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nf">validateFEN</span><span class="p">(</span><span class="nx">fen</span><span class="p">))</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="nf">getFENValidationError</span><span class="p">(</span><span class="nx">fen</span><span class="p">));</span> <span class="c1">// e.g. 'Board must have 8 ranks'</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">svg</span> <span class="o">=</span> <span class="nf">generateDiagram</span><span class="p">({</span> <span class="nx">fen</span><span class="p">,</span> <span class="na">size</span><span class="p">:</span> <span class="mi">400</span> <span class="p">});</span>
<span class="p">}</span>
</code></pre>

</div>



<h2>
  
  
  Real use cases
</h2>

<h3>
  
  
  Static site or blog
</h3>

<p>If you write about chess and want diagrams in your posts, generate them at build time:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight typescript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">writeFileSync</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">fs</span><span class="dl">'</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">generateDiagram</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@chessvision-org/chess-vision</span><span class="dl">'</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">positions</span> <span class="o">=</span> <span class="p">[</span>
  <span class="p">{</span>
    <span class="na">fen</span><span class="p">:</span> <span class="dl">'</span><span class="s1">r1bqkb1r/pppp1ppp/2n2n2/4p3/2B1P3/5N2/PPPP1PPP/RNBQK2R w KQkq - 4 4</span><span class="dl">'</span><span class="p">,</span>
    <span class="na">file</span><span class="p">:</span> <span class="dl">'</span><span class="s1">italian.svg</span><span class="dl">'</span><span class="p">,</span>
  <span class="p">},</span>
  <span class="p">{</span>
    <span class="na">fen</span><span class="p">:</span> <span class="dl">'</span><span class="s1">rnbqkb1r/pp3ppp/3ppn2/8/3NP3/2N5/PPP2PPP/R1BQKB1R w KQkq - 0 6</span><span class="dl">'</span><span class="p">,</span>
    <span class="na">file</span><span class="p">:</span> <span class="dl">'</span><span class="s1">sicilian.svg</span><span class="dl">'</span><span class="p">,</span>
  <span class="p">},</span>
<span class="p">];</span>

<span class="k">for </span><span class="p">(</span><span class="kd">const</span> <span class="p">{</span> <span class="nx">fen</span><span class="p">,</span> <span class="nx">file</span> <span class="p">}</span> <span class="k">of</span> <span class="nx">positions</span><span class="p">)</span> <span class="p">{</span>
  <span class="nf">writeFileSync</span><span class="p">(</span><span class="s2">`./diagrams/</span><span class="p">${</span><span class="nx">file</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span> <span class="nf">generateDiagram</span><span class="p">({</span> <span class="nx">fen</span><span class="p">,</span> <span class="na">size</span><span class="p">:</span> <span class="mi">480</span><span class="p">,</span> <span class="na">showCoords</span><span class="p">:</span> <span class="kc">true</span> <span class="p">}));</span>
<span class="p">}</span>
</code></pre>

</div>



<p>The output SVGs embed directly in Markdown, MDX, or HTML with no image hosting needed.</p>

<h3>
  
  
  Server-side rendering
</h3>

<p>Generate diagrams on request without spinning up a browser:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight typescript"><code><span class="k">import</span> <span class="nx">express</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">express</span><span class="dl">'</span><span class="p">;</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">generateDiagram</span><span class="p">,</span> <span class="nx">validateFEN</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@chessvision-org/chess-vision</span><span class="dl">'</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">app</span> <span class="o">=</span> <span class="nf">express</span><span class="p">();</span>

<span class="nx">app</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="dl">'</span><span class="s1">/diagram</span><span class="dl">'</span><span class="p">,</span> <span class="p">(</span><span class="nx">req</span><span class="p">,</span> <span class="nx">res</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">fen</span> <span class="o">=</span> <span class="nc">String</span><span class="p">(</span><span class="nx">req</span><span class="p">.</span><span class="nx">query</span><span class="p">.</span><span class="nx">fen</span> <span class="o">??</span> <span class="dl">''</span><span class="p">);</span>
  <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nf">validateFEN</span><span class="p">(</span><span class="nx">fen</span><span class="p">))</span> <span class="k">return</span> <span class="nx">res</span><span class="p">.</span><span class="nf">status</span><span class="p">(</span><span class="mi">400</span><span class="p">).</span><span class="nf">send</span><span class="p">(</span><span class="dl">'</span><span class="s1">Invalid FEN</span><span class="dl">'</span><span class="p">);</span>

  <span class="kd">const</span> <span class="nx">svg</span> <span class="o">=</span> <span class="nf">generateDiagram</span><span class="p">({</span> <span class="nx">fen</span><span class="p">,</span> <span class="na">size</span><span class="p">:</span> <span class="mi">400</span><span class="p">,</span> <span class="na">showCoords</span><span class="p">:</span> <span class="kc">true</span> <span class="p">});</span>
  <span class="nx">res</span><span class="p">.</span><span class="nf">setHeader</span><span class="p">(</span><span class="dl">'</span><span class="s1">Content-Type</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">image/svg+xml</span><span class="dl">'</span><span class="p">);</span>
  <span class="nx">res</span><span class="p">.</span><span class="nf">send</span><span class="p">(</span><span class="nx">svg</span><span class="p">);</span>
<span class="p">});</span>
</code></pre>

</div>



<h3>
  
  
  Astro / Next.js at build time
</h3>



<div class="highlight js-code-highlight">
<pre class="highlight typescript"><code><span class="c1">// In an Astro component or Next.js getStaticProps</span>
<span class="k">import</span> <span class="p">{</span> <span class="nx">generateDiagram</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@chessvision-org/chess-vision</span><span class="dl">'</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">svg</span> <span class="o">=</span> <span class="nf">generateDiagram</span><span class="p">({</span>
  <span class="na">fen</span><span class="p">:</span> <span class="dl">'</span><span class="s1">r1bqkbnr/pppp1ppp/2n5/4p3/4P3/5N2/PPPP1PPP/RNBQKB1R w KQkq - 2 3</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">size</span><span class="p">:</span> <span class="mi">360</span><span class="p">,</span>
  <span class="na">showCoords</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
  <span class="na">flipped</span><span class="p">:</span> <span class="kc">false</span><span class="p">,</span>
<span class="p">});</span>

<span class="c1">// Render directly — no img tag, no src, no upload</span>
<span class="c1">// &lt;Fragment set:html={svg} /&gt;   ← Astro</span>
<span class="c1">// &lt;div dangerouslySetInnerHTML={{ __html: svg }} /&gt;  ← React (SVG is from your own code, not user input)</span>
</code></pre>

</div>



<h2>
  
  
  Themes and customization
</h2>

<p>The package ships 20 built-in board themes (<code>classic</code>, <code>ocean</code>, <code>wood</code>, <code>forest</code>, <code>navy</code>, <code>marble</code>, and more):<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight typescript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">generateDiagram</span><span class="p">,</span> <span class="nx">getBoardTheme</span><span class="p">,</span> <span class="nx">listThemeIds</span><span class="p">,</span> <span class="nx">themeCoordinateColor</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@chessvision-org/chess-vision</span><span class="dl">'</span><span class="p">;</span>

<span class="nf">listThemeIds</span><span class="p">();</span>
<span class="c1">// → ['classic', 'brown', 'wood', 'sand', 'slate', 'marble', 'blue', 'ocean',</span>
<span class="c1">//    'green', 'forest', 'mint', 'purple', 'lavender', 'red', 'coral',</span>
<span class="c1">//    'sunset', 'pink', 'burgundy', 'navy', 'ice']</span>

<span class="kd">const</span> <span class="nx">theme</span> <span class="o">=</span> <span class="nf">getBoardTheme</span><span class="p">(</span><span class="dl">'</span><span class="s1">ocean</span><span class="dl">'</span><span class="p">)</span><span class="o">!</span><span class="p">;</span>
<span class="c1">// → { name: 'Ocean', light: '#c9e4f5', dark: '#4a90a4' }</span>

<span class="kd">const</span> <span class="nx">svg</span> <span class="o">=</span> <span class="nf">generateDiagram</span><span class="p">({</span>
  <span class="na">fen</span><span class="p">:</span> <span class="dl">'</span><span class="s1">rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">size</span><span class="p">:</span> <span class="mi">400</span><span class="p">,</span>
  <span class="na">lightSquare</span><span class="p">:</span> <span class="nx">theme</span><span class="p">.</span><span class="nx">light</span><span class="p">,</span>
  <span class="na">darkSquare</span><span class="p">:</span> <span class="nx">theme</span><span class="p">.</span><span class="nx">dark</span><span class="p">,</span>
  <span class="na">showCoords</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
  <span class="na">coordColor</span><span class="p">:</span> <span class="nf">themeCoordinateColor</span><span class="p">(</span><span class="nx">theme</span><span class="p">),</span> <span class="c1">// → 'white' or 'black', whichever is more legible</span>
<span class="p">});</span>
</code></pre>

</div>



<p>Or pass any hex colors directly:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight typescript"><code><span class="kd">const</span> <span class="nx">svg</span> <span class="o">=</span> <span class="nf">generateDiagram</span><span class="p">({</span>
  <span class="na">fen</span><span class="p">:</span> <span class="dl">'</span><span class="s1">rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">size</span><span class="p">:</span> <span class="mi">400</span><span class="p">,</span>
  <span class="na">lightSquare</span><span class="p">:</span> <span class="dl">'</span><span class="s1">#e8f4f8</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">darkSquare</span><span class="p">:</span> <span class="dl">'</span><span class="s1">#7eb8da</span><span class="dl">'</span><span class="p">,</span>
  <span class="na">flipped</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>       <span class="c1">// Black's perspective</span>
  <span class="na">showFrame</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>     <span class="c1">// thin outer frame</span>
  <span class="na">coordColor</span><span class="p">:</span> <span class="dl">'</span><span class="s1">white</span><span class="dl">'</span><span class="p">,</span> <span class="c1">// coordinate label color</span>
  <span class="na">label</span><span class="p">:</span> <span class="dl">'</span><span class="s1">Starting position</span><span class="dl">'</span><span class="p">,</span> <span class="c1">// aria-label on the SVG</span>
<span class="p">});</span>
</code></pre>

</div>



<h2>
  
  
  FEN utilities
</h2>

<p>The package also ships a full FEN parser if you need to work with positions directly:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight typescript"><code><span class="k">import</span> <span class="p">{</span>
  <span class="nx">parseFEN</span><span class="p">,</span>
  <span class="nx">boardToFEN</span><span class="p">,</span>
  <span class="nx">movePiece</span><span class="p">,</span>
  <span class="nx">getPieceAt</span><span class="p">,</span>
  <span class="nx">countPieces</span><span class="p">,</span>
  <span class="nx">materialBalance</span><span class="p">,</span>
  <span class="nx">findKing</span><span class="p">,</span>
  <span class="nx">STARTING_FEN</span><span class="p">,</span>
<span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@chessvision-org/chess-vision</span><span class="dl">'</span><span class="p">;</span>

<span class="c1">// Parse to an 8×8 matrix (row 0 = rank 8, row 7 = rank 1)</span>
<span class="kd">const</span> <span class="nx">board</span> <span class="o">=</span> <span class="nf">parseFEN</span><span class="p">(</span><span class="nx">STARTING_FEN</span><span class="p">);</span>
<span class="nx">board</span><span class="p">[</span><span class="mi">7</span><span class="p">][</span><span class="mi">4</span><span class="p">];</span> <span class="c1">// → 'K'  (white king on e1)</span>

<span class="nf">getPieceAt</span><span class="p">(</span><span class="nx">board</span><span class="p">,</span> <span class="dl">'</span><span class="s1">e1</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// → 'K'</span>
<span class="nf">getPieceAt</span><span class="p">(</span><span class="nx">board</span><span class="p">,</span> <span class="dl">'</span><span class="s1">d8</span><span class="dl">'</span><span class="p">);</span> <span class="c1">// → 'q'</span>

<span class="c1">// Move a piece — pure, returns a new board, never mutates</span>
<span class="kd">const</span> <span class="nx">next</span> <span class="o">=</span> <span class="nf">movePiece</span><span class="p">(</span><span class="nx">board</span><span class="p">,</span> <span class="dl">'</span><span class="s1">e2</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">e4</span><span class="dl">'</span><span class="p">);</span>
<span class="nf">boardToFEN</span><span class="p">(</span><span class="nx">next</span><span class="p">);</span> <span class="c1">// → updated piece placement string</span>

<span class="nf">countPieces</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span>    <span class="c1">// → { P: 8, N: 2, B: 2, R: 2, Q: 1, K: 1, p: 8, … }</span>
<span class="nf">materialBalance</span><span class="p">(</span><span class="nx">board</span><span class="p">);</span> <span class="c1">// → 0  (equal material)</span>
<span class="nf">findKing</span><span class="p">(</span><span class="nx">board</span><span class="p">,</span> <span class="dl">'</span><span class="s1">w</span><span class="dl">'</span><span class="p">);</span>  <span class="c1">// → 'e1'</span>
</code></pre>

</div>



<h2>
  
  
  Full FEN record
</h2>

<p>Parse and serialize all six FEN fields:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight typescript"><code><span class="k">import</span> <span class="p">{</span> <span class="nx">parseFENRecord</span><span class="p">,</span> <span class="nx">buildFENRecord</span><span class="p">,</span> <span class="nx">toggleActiveColor</span> <span class="p">}</span> <span class="k">from</span> <span class="dl">'</span><span class="s1">@chessvision-org/chess-vision</span><span class="dl">'</span><span class="p">;</span>

<span class="kd">const</span> <span class="nx">record</span> <span class="o">=</span> <span class="nf">parseFENRecord</span><span class="p">(</span><span class="dl">'</span><span class="s1">rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 5 12</span><span class="dl">'</span><span class="p">);</span>
<span class="c1">// → { board, activeColor: 'b', castling: 'KQkq', enPassant: 'e3', halfmove: 5, fullmove: 12 }</span>

<span class="nf">buildFENRecord</span><span class="p">(</span><span class="nx">record</span><span class="p">);</span>
<span class="c1">// → 'rnbqkbnr/pp1ppppp/8/2p5/4P3/8/PPPP1PPP/RNBQKBNR b KQkq e3 5 12'</span>

<span class="nf">toggleActiveColor</span><span class="p">(</span><span class="nx">record</span><span class="p">).</span><span class="nx">activeColor</span><span class="p">;</span> <span class="c1">// → 'w'</span>
</code></pre>

</div>



<h2>
  
  
  Why SVG
</h2>

<ul>
<li>Scales to any resolution without quality loss</li>
<li>Self-contained — 23 piece sets inlined as paths, no external resources</li>
<li>Embeds directly in HTML and most PDF libraries</li>
<li>Converts to raster easily with <code>sharp</code> if you need PNG</li>
</ul>

<p>If you need high-res PNG for print, the web app (<a href="https://tsecurity.de/weiterlesen/3603126/3631265/how-to-render-chess-diagrams-in-nodejs-no-dom-no-canvas-no-headless-browser/" target="_blank" rel="noopener noreferrer">chessvision.org</a>) handles that — up to 1200 DPI with accurate physical dimensions in centimeters.</p>

<h2>
  
  
  Links
</h2>

<ul>
<li>npm: <a href="https://tsecurity.de/weiterlesen/3603126/3631265/how-to-render-chess-diagrams-in-nodejs-no-dom-no-canvas-no-headless-browser/" target="_blank" rel="noopener noreferrer">@chessvision-org/chess-vision</a>
</li>
<li>GitHub: <a href="https://tsecurity.de/weiterlesen/3603126/3631265/how-to-render-chess-diagrams-in-nodejs-no-dom-no-canvas-no-headless-browser/" target="_blank" rel="noopener noreferrer">chessvision-org/chess-vision-utils</a>
</li>
<li>License: AGPL-3.0</li>
</ul>

<p>Open to feedback on the API — if something feels awkward to use or there's a use case I haven't covered, I'd like to know.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA['Supergirl' Movie Criticized for Script, Poor Visual Effects]]></title>
<description><![CDATA[The Onion joked the new movie Supergirl is about a hero who must single-handedly save the world "after the catastrophic collapse of interest in the genre." 


Unfortunately, The Hollywood Reporter says the film's reviews "range from negative to tepid praise (averaging a 58 percent Rotten Tomatoes...]]></description>
<link>https://tsecurity.de/de/3631221/it-security-nachrichten/supergirl-movie-criticized-for-script-poor-visual-effects/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3631221/it-security-nachrichten/supergirl-movie-criticized-for-script-poor-visual-effects/</guid>
<pubDate>Sun, 28 Jun 2026 18:08:39 +0200</pubDate>
<content:encoded><![CDATA[The Onion joked the new movie Supergirl is about a hero who must single-handedly save the world "after the catastrophic collapse of interest in the genre." 


Unfortunately, The Hollywood Reporter says the film's reviews "range from negative to tepid praise (averaging a 58 percent Rotten Tomatoes score)."


 Many point fingers at the film's script, with Variety's line — "a comic-book movie with the worst script I can remember" — going viral... Not to pile on, but there's another recurring gripe from the reviews that stood out: Critics bashed the film as being murky, dark and gray, with poor VFX: "Muddy CG sludge" wrote one. Another said the film was full of "sludgy browns and grays" and "the visual murkiness of the settings makes it hard to follow the already unintelligible action sequences." A third wrote the "VFX is so rough it makes The Flash look like Avatar." Moviegoers increasingly despise murky, dark visuals (often used to hide weak effects), along with obvious CGI and incoherent action. They've seen it so many times they've become allergic.
 


The Bulwark agreesterribly lit, incoherently staged, and just generally weightless and ugly... [I]t's reminiscent of the disaster that was The Flash: It's just very obvious during certain sequences that everyone was in a big green-screen warehouse and the camera was whipping around with the knowledge that everything would be painted in later, so who really gives a crap how anything looks on the day of." They call the movie "a tremendous slog of a film, a real step backwards for the James Gunn-overseen DC Universe of movies and TV shows" that's "neither fun nor exciting" and "feels empty."

 The film does have one bright spot: Lobo, who is played by Jason Momoa as something like Michael Keaton's Beetlejuice by way of Jason Momoa's Aquaman. He's blustery and cantankerous and saucy and just a little menacing; it's a perfect piece of casting and a really nice performance. Unfortunately, it's the only spark of life in what is otherwise a deeply dour, deeply boring piece of filmmaking... Supergirl is just a misfire on nearly every level, one that lacks the sincerity and fun of last year's reboot of this universe or the comic pathos present in Gunn's Peacemaker series on HBO Max. 

Reason calls it "dark, depressive, and dull" and "a downer of a movie in nearly every way."
 It's not fun. It's barely even righteous. It's just miserable. At one point, Supergirl flat-out murders a guy by pushing a giant sword through his neck. Somehow, I suspect even Zack Snyder would be appalled. 


 Time argued fans of last decade's superhero movies "should be demanding more, not less." Though "Will there be rioting in the streets once audiences get some idea of how lousy Supergirl is? Probably not."<p></p><div class="share_submission">
<a href="https://tsecurity.de/weiterlesen/3603082/3631221/supergirl-movie-criticized-for-script-poor-visual-effects/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/twitter_icon_large.png"></a>
<a href="https://tsecurity.de/weiterlesen/3603082/3631221/supergirl-movie-criticized-for-script-poor-visual-effects/" target="_blank" rel="noopener noreferrer"><img src="https://a.fsdn.com/sd/facebook_icon_large.png"></a>



</div><p><a href="https://tsecurity.de/weiterlesen/3603082/3631221/supergirl-movie-criticized-for-script-poor-visual-effects/" target="_blank" rel="noopener noreferrer">Read more of this story</a> at Slashdot.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[GLM-5.2 vs Claude Opus: What the Numbers Actually Say for Developers]]></title>
<description><![CDATA[GLM-5.2 from Z.ai dropped recently and the reaction was loud. Some called it the end of closed models. Others dismissed it as benchmark gaming. This article cuts through the noise with data from an independent hands-on test, benchmark numbers, and community discussion.

To be clear upfront: I did...]]></description>
<link>https://tsecurity.de/de/3628872/sichere-programmierung/glm-52-vs-claude-opus-what-the-numbers-actually-say-for-developers/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3628872/sichere-programmierung/glm-52-vs-claude-opus-what-the-numbers-actually-say-for-developers/</guid>
<pubDate>Sat, 27 Jun 2026 04:09:41 +0200</pubDate>
<content:encoded><![CDATA[<p>GLM-5.2 from Z.ai dropped recently and the reaction was loud. Some called it the end of closed models. Others dismissed it as benchmark gaming. This article cuts through the noise with data from an independent hands-on test, benchmark numbers, and community discussion.</p>

<p>To be clear upfront: I did not run my own head-to-head test. This article synthesizes work by James Daniel Whitford at TechStackups, independent benchmarks from Artificial Analysis, and community discussion from Hacker News. All sources are cited at the end. The goal is to help you decide which model fits your workflow.</p>

<h2>
  
  
  What Is GLM-5.2?
</h2>

<p>GLM-5.2 is Z.ai's latest flagship model, released under an MIT license as open weights. You can download it, run it locally, or call it through Z.ai's API. It ships with a 1 million token context window and is designed for long-horizon agentic tasks, the kind of multi-hour coding work that coding agents do.</p>

<p>One key limitation: GLM-5.2 is <strong>text-only</strong>. It cannot read images, parse screenshots, or understand diagrams. Claude Opus is multimodal. This difference turns out to matter a lot in practice.</p>

<h2>
  
  
  The Price Gap
</h2>

<p>Per 1 million tokens (source: TechStackups, citing Z.ai and Anthropic pricing):</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Metric</th>
<th>Claude Opus 4.8</th>
<th>GLM-5.2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Input</td>
<td>$5.00</td>
<td>$1.40</td>
</tr>
<tr>
<td>Cache read</td>
<td>$0.50</td>
<td>$0.26</td>
</tr>
<tr>
<td>Output</td>
<td>$25.00</td>
<td>$4.40</td>
</tr>
</tbody>
</table></div>

<p>On output tokens, GLM-5.2 costs roughly <strong>one-fifth</strong> of what Opus charges. If you run coding agents for hours every day, that difference compounds fast.</p>

<p>A Hacker News commenter raised a valid counterpoint: if you are on a $100/month Claude Max subscription and use it fully, the per-token cost difference shrinks considerably. Subscription pricing changes the math for heavy daily users.</p>

<h2>
  
  
  The Test: Build a 3D Game From Scratch
</h2>

<p>James Daniel Whitford at TechStackups ran both models with the same one-shot prompt: build a third-person 3D platformer in raw WebGL with no libraries. The game needed a character controller, collision detection, a follow camera, a GLB model loader, GLSL shaders, and skinned animation.</p>

<p>This is not a "make me a landing page" test. A 3D engine in raw WebGL has layers of interdependent systems. If one piece is wrong, the whole thing breaks visibly.</p>

<h3>
  
  
  Results at a Glance
</h3>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Metric</th>
<th>GLM-5.2</th>
<th>Claude Opus 4.8</th>
</tr>
</thead>
<tbody>
<tr>
<td>Build time</td>
<td>1h 10m 40s</td>
<td>33m 30s</td>
</tr>
<tr>
<td>Output tokens</td>
<td>131,000</td>
<td>216,809</td>
</tr>
<tr>
<td>Cost</td>
<td>$5.39</td>
<td>~$21.92 (estimated)</td>
</tr>
<tr>
<td>Tool calls</td>
<td>128</td>
<td>153</td>
</tr>
</tbody>
</table></div>

<p>Opus finished in half the time. GLM-5.2 cost a fraction of the price.</p>

<h3>
  
  
  Game Quality
</h3>

<p><strong>Opus</strong> shipped a cleaner game. The character had textures applied correctly. The spike hazard killed the player. There was a working win condition. The camera and controls felt right. Bugs were minor edge cases, like standing on thin air near platforms due to an overly generous coyote-time grace period.</p>

<p><strong>GLM-5.2</strong> shipped a rougher game. The character rendered as flat gray with missing textures. The spike hazard did nothing when you touched it. There was no win condition. The character model faced backwards the entire time. These were fundamental issues, not polish problems.</p>

<p>GLM-5.2 did nail one thing: a spring launch mechanic that let you bounce up to higher platforms. So it is not that the model cannot code. It struggles to hold a complex multi-file build together at the same level as Opus.</p>

<h3>
  
  
  The Multimodal Gap
</h3>

<p>Both models were told to verify their work before stopping. Opus took a screenshot of the rendered game, looked at it, noticed it had left debug overlays on screen, and cleaned them up. It could see the result and catch visual problems.</p>

<p>GLM-5.2 cannot read images. Instead of looking at a screenshot, it wrote scripts to sample pixel colors from the saved frame. It checked whether the colors matched expectations: grass green, dirt brown, coin gold. The colors were there, so it declared the game finished.</p>

<p>But the character was gray with missing textures, and the debug overlay was still visible. GLM-5.2 never saw those problems because it was reading numbers instead of looking at the image.</p>

<p>On visual tasks, this is a real disadvantage. An agent that can inspect its own output catches bugs that a text-only model will ship blind.</p>

<h2>
  
  
  What the Benchmarks Say
</h2>

<p>The table below shows numbers from Z.ai's model card. An asterisk (*) marks self-reported scores (each vendor reports its own numbers). Independent results from Artificial Analysis broadly agree with these rankings.</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Benchmark</th>
<th>GLM-5.2</th>
<th>Opus 4.8*</th>
<th>GPT-5.5*</th>
<th>Gemini 3.1 Pro*</th>
</tr>
</thead>
<tbody>
<tr>
<td>AIME 2026</td>
<td><strong>99.2</strong></td>
<td>95.7</td>
<td>98.3</td>
<td>98.2</td>
</tr>
<tr>
<td>GPQA-Diamond</td>
<td>91.2</td>
<td><strong>93.6</strong></td>
<td><strong>93.6</strong></td>
<td><strong>94.3</strong></td>
</tr>
<tr>
<td>SWE-bench Pro</td>
<td>62.1</td>
<td><strong>69.2</strong></td>
<td>58.6</td>
<td>54.2</td>
</tr>
<tr>
<td>Terminal Bench (Terminus-2)</td>
<td>81.0</td>
<td><strong>85</strong></td>
<td>84</td>
<td>74</td>
</tr>
<tr>
<td>SWE-Marathon</td>
<td>13.0</td>
<td><strong>26.0</strong></td>
<td>12.0</td>
<td>4.0</td>
</tr>
</tbody>
</table></div>

<p>GLM-5.2 actually beats Opus on AIME 2026 (math competition). But Opus dominates the coding and long-horizon agentic benchmarks, especially SWE-Marathon where it doubles GLM-5.2's score. GPT-5.5 trails GLM-5.2 on coding benchmarks like SWE-bench Pro (58.6 vs 62.1) and SWE-Marathon (12.0 vs 13.0), but edges ahead on Terminal Bench (84 vs 81).</p>

<p>Independent benchmarking from Artificial Analysis ranks GLM-5.2 as the leading open-weights model with an Intelligence Index score of 51, ahead of MiniMax-M3 (44) and DeepSeek V4 Pro (44). They note it is token-hungry, using about 43k output tokens per task, more than any other leading open model.</p>

<p>Simon Willison, who has reviewed nearly every major model release, called GLM-5.2 "probably the most powerful text-only open weights LLM" on X. Nathan Lambert from the Allen Institute for AI noted that Chinese labs are reaching these scores on less compute, and the open-closed gap is closing faster than many expected.</p>

<h2>
  
  
  What HN Commenters Added
</h2>

<p>The Hacker News discussion (170+ points, 149 comments) added practical ground truth:</p>

<ul>
<li>One developer found GLM-5.2 solved a 3D fluid dynamics rendering problem that both Opus and GPT-5.5 struggled with</li>
<li>Another noted GLM-5.2 takes its time before generating code and sometimes hallucinates plans it does not follow</li>
<li>Several pushed back on one-shot testing as not representative of real collaborative agent workflows</li>
<li>One commenter claimed "Chinese models optimize for benchmarks and do poorly in real-world tasks" (others disputed this)</li>
</ul>

<h2>
  
  
  What This Means for Developers
</h2>

<p>The WebGL test is one data point from one prompt. Real development work is different. Here is how to think about the tradeoffs for everyday use.</p>

<p><strong>For boilerplate and standard CRUD code</strong>, GLM-5.2 is likely sufficient. Writing a JPA repository, a REST controller, or a Kafka consumer configuration is well-trodden territory. At one-fifth the cost of Opus, GLM-5.2 makes economic sense for these tasks.</p>

<p><strong>For debugging complex issues</strong>, Opus pulls ahead. When you have a Kafka rebalance storm caused by a subtle consumer group configuration issue, or a Redis cache invalidation race condition, the difference between SWE-bench Pro 69.2 and 62.1 could matter. Correctness matters more than cost when you are chasing a production bug.</p>

<p><strong>The multimodal gap depends on your work.</strong> If you build UIs, run visual regression tests, or work with screenshots, Opus can inspect its own output. If your work is mostly text (stack traces, log files, SQL queries, configuration), GLM-5.2's text-only limitation is less of a problem.</p>

<p><strong>The real value of open weights is operational.</strong> A closed model can have an outage, change its pricing, or restrict access. We saw Claude outages hit HN's front page multiple times already this year. GLM-5.2 running on your own hardware has none of those risks.</p>

<h3>
  
  
  How to Try Both Models
</h3>

<p>Both models are accessible through their official platforms:</p>

<ul>
<li>
<strong>GLM-5.2</strong>: Available via Z.ai's API at <a href="https://tsecurity.de/weiterlesen/3600733/3628872/glm-52-vs-claude-opus-what-the-numbers-actually-say-for-developers/" target="_blank" rel="noopener noreferrer">open.bigmodel.cn</a>, or through OpenRouter. The weights are on Hugging Face under MIT license if you want to self-host.</li>
<li>
<strong>Claude Opus</strong>: Available via Anthropic's API at <a href="https://tsecurity.de/weiterlesen/3600733/3628872/glm-52-vs-claude-opus-what-the-numbers-actually-say-for-developers/" target="_blank" rel="noopener noreferrer">platform.claude.com</a>, or through AWS Bedrock and Google Vertex AI.</li>
</ul>

<p>Z.ai's platform supports an OpenAI-compatible SDK, so if you already use the OpenAI Python library, migration is minimal. Anthropic provides its own Python SDK. Both have free tiers or trial credits to get started.</p>

<h2>
  
  
  Practical Takeaway
</h2>

<p>Neither model wins everything.</p>

<p><strong>Use Claude Opus when:</strong></p>

<ul>
<li>You need visual verification (screenshots, UI testing, image analysis)</li>
<li>Correctness and polish matter more than cost</li>
<li>You are debugging complex, multi-file issues</li>
<li>You want the best coding benchmarks available</li>
</ul>

<p><strong>Use GLM-5.2 when:</strong></p>

<ul>
<li>Cost is a primary concern (it is 4-5x cheaper)</li>
<li>You need open weights that cannot be taken away or restricted</li>
<li>The work is primarily text and logic, not visual</li>
<li>You want to run it locally on your own hardware</li>
<li>You need a fallback when closed models have outages</li>
</ul>

<p>The smartest approach is to keep both in your toolkit. Use GLM-5.2 for the bulk of text-heavy work where the cost savings add up. Switch to Opus when you need visual judgment, maximum coding reliability, or the kind of long-horizon reasoning where it clearly leads.</p>

<p>The open weights gap is real, but it is narrowing. GLM-5.2 proves you no longer need to pay premium prices to get a genuinely capable coding model. It does not beat Opus yet, but it does not need to. It just needs to be good enough for most tasks, and cheap enough that the math works.</p>




<h2>
  
  
  Sources
</h2>

<ol>
<li>
<strong>James Daniel Whitford / TechStackups</strong> - "GLM-5.2 vs Claude Opus" (June 18, 2026) - <a href="https://tsecurity.de/weiterlesen/3600733/3628872/glm-52-vs-claude-opus-what-the-numbers-actually-say-for-developers/" target="_blank" rel="noopener noreferrer">techstackups.com</a>
</li>
<li>
<strong>Hacker News Discussion</strong> (170 pts, 149 comments) - <a href="https://tsecurity.de/weiterlesen/3600733/3628872/glm-52-vs-claude-opus-what-the-numbers-actually-say-for-developers/" target="_blank" rel="noopener noreferrer">news.ycombinator.com</a>
</li>
<li>
<strong>Artificial Analysis</strong> - Intelligence Index v4.1 rankings (via X)</li>
<li>
<strong>Simon Willison</strong> - Model review (via X)</li>
<li>
<strong>Nathan Lambert</strong> - Allen Institute for AI commentary (via X)</li>
<li>
<strong>Z.ai</strong> - Model card and pricing (referenced via TechStackups; not independently verified by author)</li>
<li>
<strong>Anthropic</strong> - API documentation at <a href="https://tsecurity.de/weiterlesen/3600733/3628872/glm-52-vs-claude-opus-what-the-numbers-actually-say-for-developers/" target="_blank" rel="noopener noreferrer">platform.claude.com</a>
</li>
</ol>]]></content:encoded>
</item>
<item>
<title><![CDATA[Camp Snoopy Season Two Is Finally Streaming With Fun New Episodes]]></title>
<description><![CDATA[Fans of the classic Peanuts characters have a lot to look forward to this week. A brand new batch of adventures starring Charlie Brown and his beloved dog is finally here. You can now stream the second season of Camp Snoopy from the comfort of your living room. The latest chapters just dropped on...]]></description>
<link>https://tsecurity.de/de/3628560/apple-ios-macos/camp-snoopy-season-two-is-finally-streaming-with-fun-new-episodes/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3628560/apple-ios-macos/camp-snoopy-season-two-is-finally-streaming-with-fun-new-episodes/</guid>
<pubDate>Fri, 26 Jun 2026 22:55:16 +0200</pubDate>
<content:encoded><![CDATA[Fans of the classic Peanuts characters have a lot to look forward to this week. A brand new batch of adventures starring Charlie Brown and his beloved dog is finally here. You can now stream the second season of Camp Snoopy from the comfort of your living room. The latest chapters just dropped on Apple TV, giving families plenty of fresh outdoor fun to enjoy during the warm summer months.



Camp Snoopy release details




Episodes: 13 episodes



Genre: Animated family comedy



Premiere date: June 26, 2026



Release plan: All episodes available on premiere day



Where to watch: Apple TV




The new season takes the gang back to summer camp



The second season of this animated show brings the famous beagle and his scout friends back into nature. They are spending their time at Camp Spring Lake this summer. The group is ready to tackle the great outdoors while searching for hidden treasures like the elusive hedge toad.



At the same time, Charlie Brown and the rest of the gang are enjoying classic camp activities. They spend their days building tall sandcastles, swimming, and arguing over whether hot dogs are better than hamburgers. The stories stay true to the simple charm that fans always expect from these familiar faces.



Creators bring thirteen fresh episodes for fans to watch



You will find plenty of content to keep everyone entertained. The latest season features thirteen full episodes, and they are all packed with gentle humor. Viewers of all ages can watch the characters overcome fun challenges together.



The series is made by WildBrain and Peanuts, keeping the style of the original comic strip created by Charles M. Schulz. It is directed by Rob Boutilier, who helps make sure the animation looks just right. The whole project was put together specifically for the streaming service managed by Apple.



Unlike some shows that release one part a week, this animated series gave fans everything all at once. The platform made the entire second season available globally on June 26. This release format makes it very easy to sit down and watch multiple stories in one sitting.



If you are looking for other exciting things to watch on the platform, there is more on the way. For example, sci-fi fans can catch up before Silo season 3 hits Apple TV next week with three big plot shifts. Until then, the fresh animated adventures of the Beagle Scouts should offer a really fun escape for the whole family.]]></content:encoded>
</item>
<item>
<title><![CDATA[Silo Season 3 Hits Apple TV Next Week With Three Big Plot Shifts]]></title>
<description><![CDATA[Fans of the hit dystopian series can finally mark their calendars. The wait is almost over for the next chapter of this gripping story. If you have been searching for the Silo season 3 release date and first trailer, you will be happy to know the show premieres on July 3. It is bringing some majo...]]></description>
<link>https://tsecurity.de/de/3628207/apple-ios-macos/silo-season-3-hits-apple-tv-next-week-with-three-big-plot-shifts/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3628207/apple-ios-macos/silo-season-3-hits-apple-tv-next-week-with-three-big-plot-shifts/</guid>
<pubDate>Fri, 26 Jun 2026 19:39:25 +0200</pubDate>
<content:encoded><![CDATA[Fans of the hit dystopian series can finally mark their calendars. The wait is almost over for the next chapter of this gripping story. If you have been searching for the Silo season 3 release date and first trailer, you will be happy to know the show premieres on July 3. It is bringing some major twists to the underground world.



The show is moving beyond the first book to weave together storylines from the rest of the trilogy. You can expect a fresh timeline, a huge shift in leadership, and plenty of new faces when it lands next week.



Quick details




Title: Silo



Genre: Sci-Fi, drama



Lead star: Rebecca Ferguson



Premiere date: July 3, 2026



Setting: Dystopian underground society




According to Apple's official description of Silo Season 3-




"Season three of “Silo” continues the saga of a dystopian society of 10,000 people living underground under mysterious circumstances, while revealing an origin story set centuries earlier. In the present, Juliette Nichols (Ferguson) survives her forced “cleaning” but returns with memory loss as the silo recovers from rebellion and faces a dangerous new threat."




The story jumps back in time to explore the surface



Instead of picking up exactly where the second book starts, the new season blends events from the second and third books by Hugh Howey. This means the show will step outside the dark walls of the silo to show us what the world looked like before the underground structures were built.



It is a big change from the familiar setting. The split timeline allows the story to dig into the origins of the silos, giving answers about how this society started. Meanwhile, the present day plot will still follow Juliette and the characters you already know from previous seasons created by Apple. It is making sure its biggest hit stays fresh by expanding the world.



New actors join the cast to play people from the past



Because a large part of the story focuses on the world before the silos, the show is bringing in a bunch of new talent. You might have seen a quick look at Jessica Henwick and Ashley Zukerman at the end of the second season. They play a journalist and a congressman who stumble onto a dangerous conspiracy.



Other fresh faces include Laura Innes, Jessica Brown Findlay, Morven Christie, Reed Birney, Matt Craven, and Colin Hanks. They will help flesh out this earlier timeline as the show expands its universe and explores the events that forced humanity underground.



Juliette takes charge as the new mayor of the silo



A teaser clip shared earlier this year confirmed a massive career change for the main character. Juliette is now the mayor of the silo. This completely changes her dynamic with the rest of the underground community.



The last time we saw Juliette, she was fighting for her life in an airlock with the previous mayor, Bernard, while flames surrounded them. It is clear she made it out of that situation alive and ended up taking his job. You can catch up on the earlier episodes on Apple TV before the new ones drop.



With a new role for Juliette, a fresh cast of characters, and a timeline that finally reveals the outside world, this season promises to answer some of the biggest questions fans have had since the beginning. It will be interesting to see how the show balances the past and present without losing the tense atmosphere that made it a hit.]]></content:encoded>
</item>
<item>
<title><![CDATA[Why generating code isn’t the same as code intelligence]]></title>
<description><![CDATA[AI code generation tools can spin up a new endpoint, a data model, or a UI flow in minutes. The problem starts when that code needs to land inside a ten-year-old system with shared libraries, half-documented conventions, and business rules buried in multiple different services. 

This article loo...]]></description>
<link>https://tsecurity.de/de/3627738/sichere-programmierung/why-generating-code-isnt-the-same-as-code-intelligence/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3627738/sichere-programmierung/why-generating-code-isnt-the-same-as-code-intelligence/</guid>
<pubDate>Fri, 26 Jun 2026 16:42:59 +0200</pubDate>
<content:encoded><![CDATA[<p>AI code generation tools can spin up a new endpoint, a data model, or a UI flow in minutes. The problem starts when that code needs to land inside a ten-year-old system with shared libraries, half-documented conventions, and business rules buried in multiple different services. </p>

<p>This article looks at what vibe coding does well, and why AI code intelligence has become the missing piece for teams that need to find the logic they want to change before generating new code. </p>

<h2>
  
  
  What is vibe coding?
</h2>

<p>Vibe coding is prompt-driven code generation  without a detailed plan for implementation - you describe what you want in natural language, and an AI tool produces the code. No more switching between your editor and the docs to figure out the correct syntax. </p>

<p>Andrej Karpathy coined the term in early 2025 to describe a workflow in which AI handles most of the code generation while developers focus on direction and review. </p>

<h2>
  
  
  From writing to reviewing
</h2>

<p>Developers increasingly act as reviewers of generated code rather than its sole authors. Different tools support this shift in various ways. </p>

<p>Cursor and Claude Code let you make changes across multiple files by describing what you want and then approving the diffs. </p>

<p>GitHub Copilot suggests blocks of logic based on the file you are working in. </p>

<p>All AI code generation tools are optimized for speed to first output. The workflow is the same: you prompt, you review, you accept. </p>

<h2>
  
  
  The fake productivity trap
</h2>

<p>It feels incredibly productive. </p>

<p>You don't have to remember syntax or type out boilerplate. You describe what you want, and the model generates a working function before you finish your coffee. I've seen developers prototype entire API endpoints in an hour that would have taken a day to write manually. </p>

<p>But there's a reason it feels productive rather than being productive. You're generating code, but you may not fully understand it.  </p>

<p>If you don’t understand what’s being generated, the project effectively lives inside the model’s context window. Once that context is gone, the model starts reasoning almost from scratch, with limited memory of earlier decisions. </p>

<p>That gap becomes much more visible when working in an existing codebase with years of accumulated logic, undocumented decisions, and patterns that exist for reasons no one remembers. </p>

<p>Vibe coding encourages isolated, local changes without a view of the broader system. Over time, this turns enterprise codebases into a patchwork rather than a coherent architecture. </p>

<h2>
  
  
  How AI code intelligence works
</h2>

<p>AI code intelligence solves a different problem than vibe coding. Instead of generating new code from a prompt, it helps you locate and understand existing code.  </p>

<p><strong>Grep vs semantic search</strong></p>

<p>Traditional search tools like grep rely on pattern matching. They search for exactly what the developer specifies, whether that’s a literal string or a regular expression. This makes them powerful for finding known patterns, but limited to the form of the query itself. A search for “user authentication” will still miss a function named verify_identity because the words don’t appear, even though the behavior is related. </p>

<p>Semantic code search works differently. The system converts both code and your natural language query into vector representations in a high-dimensional space, then calculates the distance between them. A query for "handle payment failure" will mathematically align with process_transaction_error because the model understands the semantic relationship between "failure" and "error" in a transactional context. </p>

<p>I still use grep when  I search for exact matches with 100% accuracy . But when I'm trying to answer "where do we handle retries?" in a codebase I didn't write, pattern matching won't get me there. </p>

<p><strong>Understanding real, production code paths</strong></p>

<p>Vibe coding tools might hallucinate a library or method that should exist but doesn't. With AI search, results are constrained to actual code. </p>

<p>The best search tools go further than semantics. They include static analysis (call graphs), so you're not just finding a function, but also seeing where it fits. Who calls it, what data it takes in, and what it triggers downstream. And because the output is always a pointer to a real file and line number in version control, there's nothing to hallucinate. The code either exists or it doesn't. </p>

<p><strong>Code intelligence tools for complex architectures</strong></p>

<p>These tools index entire repositories, sometimes dozens at once, so developers can search across the full engineering footprint. </p>

<p>Sourcegraph pioneered this category. It combines code search with Cody, an AI agent that follows connections between repos to answer questions such as "where is rate-limiting applied across all microservices?"  </p>

<p><a href="https://tsecurity.de/weiterlesen/3599599/3627738/why-generating-code-isnt-the-same-as-code-intelligence/" target="_blank" rel="noopener noreferrer">CodeQA</a> is built for enterprises that need to keep data on-premises - answers are grounded in your production code, pointing to specific files and line numbers. It’s optimized for LLMs which can be hosted locally on private - nothing leaves your environment.  </p>

<h2>
  
  
  Code generation vs. code comprehension
</h2>

<p>Most conversations about AI code generation tools focus on how fast the model can produce working code. But writing new code isn’t the most time-consuming part. </p>

<p>Maintenance and evolution of existing systems take up 50-80% of total software lifecycle costs. Most of that cost comes from: </p>

<ul>
<li>understanding how legacy systems connect </li>
<li>tracing why architectural decisions were made </li>
<li>finding where specific logic actually lives.</li>
</ul>

<p><strong>How greenfield and brownfield work differ</strong></p>

<p>Greenfield means starting from scratch - no legacy code, no existing constraints. Brownfield is the opposite: building within existing systems, working around live software and decisions made years ago that nobody fully remembers. </p>

<p>Most developers work in brownfield. Greenfield projects require 40-60% higher initial investment, which is why enterprises usually choose to evolve what they have rather than rewrite from zero. </p>

<p>Responsible vibe coding handles greenfield well. But when you try to generate a feature into a ten-year-old monolith, you hit limits. The model can only see what fits in its context window; it has no visibility into the rest of the codebase. That’s a structural blind spot. </p>

<p>I've seen this go wrong in predictable ways. The generated code compiles fine, but it skips the error-handling pattern everyone else uses. Or it pulls in a library that was deprecated two years ago. Or it rebuilds a utility function that already exists three folders over. </p>

<p>The code works. It just doesn't fit. </p>

<p><strong>The "more code" problem</strong></p>

<p>There's a misconception that enterprises need more code. In my experience, the opposite is true. Most organizations I work with are drowning in complexity. They are trying to figure out how to search code faster within existing systems. </p>

<p>Studies on AI adoption have shown an 8x increase in duplicated code blocks. Developers spend less than 20% of their time writing new code. The rest goes to CI/CD, monitoring, security, as well as maintenance of existing code and fixes.</p>

<p>More code without more capacity to understand it means technical debt grows faster than the team can manage. Vibe coding adds to the pile. Code search, meanwhile, works the other way: it helps teams find and reuse existing code before writing new one. </p>

<p><strong>The hidden cost of hallucinated patterns</strong></p>

<p>And sometimes what it adds shouldn't be there at all. </p>

<p>Researchers found that nearly 20% of package recommendations from code-generating LLMs referenced non-existent packages.  In private codebases, the problem often looks different. Instead of guessing blindly, the model recreates functionality that already exists, because it has no visibility into the company’s internal code. </p>

<p>That grounding is what makes code search safe. When the answer is always a file, a function, and a line number from your own repo, there’s no room for invented packages or imaginary APIs. </p>

<h2>
  
  
  Why vibe coding fails at scale
</h2>

<p>Vibe coding is constrained by the model’s context window. Even when it attempts to search the project and understand its details, that window is too small for large codebases, so it works with an incomplete picture of the system.  </p>

<p>In enterprise systems, where logic, dependencies, and constraints accumulate over years, that level of understanding is not sufficient. </p>

<p><strong>The problem with AI code search across multiple repos</strong> </p>

<p>Most vibe coding tools only operate on what the developer has open - the current project and the current file. They can't see the API contract defined in a different repository. </p>

<p>A developer asks the AI to update a user payload. The AI updates the local Python service, but it misses the TypeScript type definition in the frontend repo and the Kafka schema in the data pipeline. The code passes unit tests locally but causes a runtime serialization error in production. </p>

<p>AI code intelligence works differently - it lets you ask  “where do we build and validate the user payload?” across the entire organization, not just the active window. </p>

<p><strong>What the model doesn't know</strong></p>

<p>Old codebases are full of code that looks wrong but exists for a reason. A weird workaround that handles an edge case from 2016, or a manual parser instead of a standard library, because the standard library couldn't handle a specific input format. These decisions often aren't documented. They live in the heads of senior engineers or are buried in commit messages nobody reads. </p>

<p>AI doesn't know any of that. It sees the weirdness as inefficiency and "fixes" it. The code gets cleaner, but then, something breaks.  </p>

<p><strong>Why AI-generated code creates security and compliance risk</strong></p>

<p>62% of AI-generated code solutions contain design flaws or known security vulnerabilities. Models tend to produce code that runs, not code that follows a team’s security or compliance standards. </p>

<p>When dozens of developers rely on their own prompts, the codebase drifts. </p>

<ul>
<li>one team uses async/await, another sticks to Promises, a third introduces its own helper layer around the same API </li>
<li>security conventions fade </li>
<li>compliance rules bend across a long stream of pull requests.</li>
</ul>

<p>Code search brings those patterns back into view. It shows the shared helper code and the conventions that passed review. Knowing what is already in place beats adding another variation. </p>

<h3>
  
  
  The hybrid reality and intelligent code navigation
</h3>

<p>The question is not whether to use AI code generation or AI code intelligence. Mature teams use both, with clear roles for each. </p>

<p><strong>Why generation and search work together</strong></p>

<p>Generation tools write code fast. Search tools assist them in creating fitting code. </p>

<p>In strong teams, search comes first. Before a developer asks an AI system to build or refactor something, they review the services, interfaces, and prior implementations that already handle similar work. The generator then operates within that context, so the output matches the system's design rather than introducing a parallel version. </p>

<p>In practice, that means: </p>

<ul>
<li>using generation for scaffolding, repetitive logic, and well-defined changes </li>
<li>using code intelligence tool before generating to surface existing components and patterns </li>
<li>using code understanding and generation simultaneously, with code generation asking code search questions about the existing codebase.</li>
</ul>

<p>Teams that get this right treat search as the starting point, not a cleanup step. </p>

<p><strong>Code intelligence as the grounding layer for long-lived systems</strong></p>

<p>Generation gives you something to start from, but search tells you how this problem was handled last time, in this system, by this team. That context decides whether new code slides into place or starts pulling the codebase apart. </p>

<p>In teams that run large, long-lived systems, this turns into a habit. Developers look for how data, APIs, and flows are already wired together before asking AI to add anything new, so the codebase grows by extension rather than by copy-paste. </p>

<p><strong>Conclusion</strong></p>

<p>The market keeps asking how fast AI can write code. For most enterprise teams, the harder part is understanding their existing codebase and building on top of it without breaking production. That is where AI code intelligence tools change how teams work. </p>

<p><a href="https://tsecurity.de/weiterlesen/3599599/3627738/why-generating-code-isnt-the-same-as-code-intelligence/" target="_blank" rel="noopener noreferrer">See how AI code intelligence works on real repositories → </a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The latest issue of Raspberry Pi Official Magazine out NOW!]]></title>
<description><![CDATA[Author: Raspberry Pi - Bewertung: 0x - Views:1 Read it now: 

https://magazine.raspberrypi.com/issues/167

The smart home is the dream of anyone who watched Back to the Future as a kid and identified with Doc Brown rather than Marty McFly. Who doesn’t want the power to control your kettle/oven/ti...]]></description>
<link>https://tsecurity.de/de/3626971/youtube-security-videos/the-latest-issue-of-raspberry-pi-official-magazine-out-now/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3626971/youtube-security-videos/the-latest-issue-of-raspberry-pi-official-magazine-out-now/</guid>
<pubDate>Fri, 26 Jun 2026 12:00:18 +0200</pubDate>
<content:encoded><![CDATA[<p>Author: Raspberry Pi - Bewertung: 0x - Views:1 <br/></p><p><iframe id="ytplayer" loading="lazy" type="text/html" width="100%" height="auto" src="https://www.youtube.com/embed/affpb4Meelo?autoplay=1&origin=http://tsecurity.de" frameborder="0"></iframe></p><p>Read it now: <br />
<br />
https://magazine.raspberrypi.com/issues/167<br />
<br />
The smart home is the dream of anyone who watched Back to the Future as a kid and identified with Doc Brown rather than Marty McFly. Who doesn’t want the power to control your kettle/oven/time machine through a single device, or even better, automatically? This issue we’ll discover how to run all your smart devices through Raspberry Pi.<br />
<br />
- Generate jigsaws using FreeCAD and Python<br />
- Convert a CNC machine to run on Raspberry Pi<br />
- Build a better trip computer for your bike<br />
- Preserve food with computerised smoke<br />
<br />
<br />
<br />
<br />
Before you go, please subscribe to our channel!<br />
<br />
Buy a Raspberry Pi: https://www.raspberrypi.com/products/<br />
<br />
You can also find us on TikTok, Instagram, Threads, Facebook, LinkedIn and Twitter/X<br/></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[I stopped watching Azure tutorials and passed AZ-900. Here's what I changed.]]></title>
<description><![CDATA[I had bookmarked every AZ-900 resource on the internet. Savill. 
Microsoft Learn. FreeCodeCamp. Andrew Brown. I'd watched probably 
50 hours of content and still felt like I couldn't book the exam.

The fix was embarrassingly simple: I stopped watching and started doing.


  
  
  The passive lea...]]></description>
<link>https://tsecurity.de/de/3625502/sichere-programmierung/i-stopped-watching-azure-tutorials-and-passed-az-900-heres-what-i-changed/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3625502/sichere-programmierung/i-stopped-watching-azure-tutorials-and-passed-az-900-heres-what-i-changed/</guid>
<pubDate>Thu, 25 Jun 2026 19:42:55 +0200</pubDate>
<content:encoded><![CDATA[<p>I had bookmarked every AZ-900 resource on the internet. Savill. <br>
Microsoft Learn. FreeCodeCamp. Andrew Brown. I'd watched probably <br>
50 hours of content and still felt like I couldn't book the exam.</p>

<p>The fix was embarrassingly simple: I stopped watching and started doing.</p>

<h2>
  
  
  The passive learning trap
</h2>

<p>Videos are great for understanding <em>what</em> something is. But the AZ-900 <br>
exam doesn't ask "did you watch a video about VNets?" It asks you to <br>
pick the right answer between four options that all sound plausible.</p>

<p>That recognition only comes from having actually clicked through the <br>
thing at least once.</p>

<p>I'd watched Savill explain NSGs three times and still froze on a <br>
scenario question about inbound rules. Five minutes in the portal <br>
fixed what three rewatches couldn't.</p>

<h2>
  
  
  What "hands-on" actually means
</h2>

<p>Not a 4-hour guided lab. Not another sandbox course.</p>

<p>Just: open Cloud Shell, run the command from the video, delete the <br>
resource group. 15 minutes. Done.</p>

<p>The daily habit that changed everything: one Azure service per day. <br>
Create it, poke around, delete it. That's it.</p>

<h2>
  
  
  What the AZ-900 exam is actually testing
</h2>

<p>The exam is broad, not deep. It doesn't ask you to architect anything. <br>
It asks whether you can recognize what App Service is vs Container <br>
Instances in a one-paragraph scenario.</p>

<p>If you've deployed both even once, the answer is obvious. If you <br>
haven't, you're guessing between two things that both "host apps."</p>

<h2>
  
  
  A free reference if you're mid-prep
</h2>

<p>I put together a cheat sheet covering all three exam domains — <br>
key terms, service comparisons, when to use what:</p>

<p>👉 azure.keepstreaking.com/az-900-cheat-sheet</p>

<p>No signup, completely free.</p>

<h2>
  
  
  If you want the structured version
</h2>

<p>I eventually packaged the daily habit approach into a 30-day <br>
challenge — one hands-on task per day, each mapped to an AZ-900 <br>
topic, with streak accountability so you actually finish it.</p>

<p>Days 1–5 are free: azure.keepstreaking.com</p>

<p>It's not a replacement for Savill or Microsoft Learn. It's the <br>
hands-on layer that sits on top of them.</p>




<p>Good luck with the exam. It's very passable — you just need to <br>
have touched the things, not memorized them.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[AI Won’t Just Build the Next App. It Will Rebuild the Old Ones.]]></title>
<description><![CDATA[The biggest AI opportunity in web development might not be the next shiny app.

It might be the old one your company is afraid to touch.

Every day, businesses run on software that still works but no longer feels modern. Old admin panels. Internal CRMs. Laravel dashboards built years ago. Blade v...]]></description>
<link>https://tsecurity.de/de/3624783/sichere-programmierung/ai-wont-just-build-the-next-app-it-will-rebuild-the-old-ones/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3624783/sichere-programmierung/ai-wont-just-build-the-next-app-it-will-rebuild-the-old-ones/</guid>
<pubDate>Thu, 25 Jun 2026 15:54:11 +0200</pubDate>
<content:encoded><![CDATA[<p>The biggest AI opportunity in web development might not be the next shiny app.</p>

<p>It might be the old one your company is afraid to touch.</p>

<p>Every day, businesses run on software that still works but no longer feels modern. Old admin panels. Internal CRMs. Laravel dashboards built years ago. Blade views nobody wants to refactor. Reporting tools with confusing filters. Support screens with too many columns. Customer portals that make money but slow down every new feature.</p>

<p>That is where things get interesting.</p>

<p>Most AI conversations focus on building something new from scratch. A founder has an idea, generates a prototype, writes some code with an AI assistant, connects a model API, and launches an MVP. That is a real use case, and it matters.</p>

<p>But most software work does not start with a blank repository. It starts with an existing product, existing users, existing data, existing bugs, existing business rules, and years of decisions that made sense at the time.</p>

<p>AI is not just a startup accelerator. It is becoming a modernization engine.</p>

<p>The next wave of AI in web development will not only be about launching new products faster. It will also be about upgrading the products companies already depend on.</p>

<h2>
  
  
  The real opportunity is inside existing workflows
</h2>

<p>A lot of “AI-powered” products today follow the same pattern: take a normal app, add a chat window, and call it innovation.</p>

<p>That is not enough.</p>

<p>A support dashboard does not need a chatbot in the corner. It needs ticket summaries, priority detection, suggested replies, and better routing. A CRM does not need a generic assistant. It needs account summaries, follow-up suggestions, risk signals, and smarter search. An accounting tool does not need AI decoration. It needs invoice classification, document extraction, anomaly detection, and review workflows.</p>

<p>The best AI features do not feel like separate products. They feel like the existing product got smarter.</p>

<p>That is the key difference.</p>

<p>AI should not force users into a new workflow just because the technology is exciting. It should remove friction from the workflow they already use every day. It should reduce repetitive work, surface useful context, help users make decisions faster, and keep humans in control where judgment matters.</p>

<p>That is where the real value is.</p>

<h2>
  
  
  There are two AI development paths now
</h2>

<p>There are two major ways AI is changing product development.</p>

<p>The first path is greenfield development. This is the startup path. You begin with an idea, write a product brief, explore the interface in Figma, create a functional prototype with Figma Make, validate the flow with users, then build the real application with Laravel, an AI coding agent, and the Laravel AI SDK.</p>

<p>This is powerful because the cost of going from idea to working product has dropped dramatically.</p>

<p>The second path is brownfield modernization. This is the path most real companies need. You already have a working product. Maybe it is profitable. Maybe users rely on it every day. But the UI feels outdated, the codebase has too many patterns, the product is hard to extend, and every improvement feels risky.</p>

<p>This path is not about moving fast and breaking things. It is about improving one valuable workflow at a time without breaking the business.</p>

<p>Same tools. Different mindset.</p>

<p>For a new product, the question is: how quickly can we validate this idea?</p>

<p>For an existing product, the question is: how can we make this system better without turning modernization into a six-month rewrite?</p>

<p>AI helps with both, but the second opportunity may be much larger.</p>

<h2>
  
  
  Start with the workflow, not the model
</h2>

<p>The biggest mistake teams make is starting with the tech stack.</p>

<p>They ask: Should we use OpenAI or Anthropic? Should we use Cursor or GitHub Copilot? Should we use React, Vue, Livewire, or Blade? Should we build an agent? Should we add vector search?</p>

<p>Those questions matter, but they are not the starting point.</p>

<p>The starting point is the workflow.</p>

<p>What does the user do every day? Where do they waste time? Where do they copy and paste? Where do they wait? Where do they make mistakes? Where do they need context before making a decision? Which part of the workflow is repetitive enough to automate but important enough to improve?</p>

<p>“Modernize our app” is too vague.</p>

<p>“Help support managers review, prioritize, and respond to tickets faster” is specific. That kind of problem gives every tool a clear job.</p>

<p>Figma helps rethink the user experience. Figma Make helps test the improved flow before production work starts. Figma MCP helps move real design context into the coding environment. An AI coding agent helps inspect the existing codebase and implement focused changes. Laravel provides the application structure. Laravel AI SDK adds intelligent behavior where it actually belongs.</p>

<p>That is a real workflow.</p>

<h2>
  
  
  Figma AI is useful because legacy products are messy
</h2>

<p>Legacy products usually have one big problem: they were built in layers.</p>

<p>One screen was designed in 2019. Another was added during a rushed customer request. A third was built by a different developer with a different frontend approach. A fourth was patched quickly and never revisited. After a few years, the product still works, but it feels like five different apps living inside one interface.</p>

<p>This is exactly where Figma AI can help.</p>

<p>You can take an old workflow and rethink it around the job the user is actually trying to complete. You can simplify layouts, clean up forms, improve hierarchy, create better empty states, standardize components, and explore several directions quickly.</p>

<p>The point is not to let AI make all design decisions. That would be lazy and usually wrong.</p>

<p>The point is to speed up exploration.</p>

<p>Instead of spending days just getting to the first usable direction, a designer, developer, founder, or product owner can generate options, compare them, edit them, and move faster toward a clearer interface.</p>

<p>For modernization, that matters a lot. The goal is not to make the old screen prettier. The goal is to make the workflow easier to understand and faster to use.</p>

<h2>
  
  
  Figma Make lets you test before you rebuild
</h2>

<p>Modernization projects often fail because teams rebuild too much too early.</p>

<p>They redesign a large feature, spend weeks implementing it, release it, and then discover that users still have the same problem. The new version looks better, but the workflow is still wrong.</p>

<p>Figma Make helps reduce that risk.</p>

<p>Instead of jumping directly into production code, you can turn a redesigned flow into a functional prototype. Users can click through the new experience, open records, filter tables, review AI suggestions, approve actions, and move through the product before developers commit to a full rebuild.</p>

<p>That feedback is much more useful than comments on static mockups.</p>

<p>A clickable prototype reveals things a screenshot cannot. Maybe the main action is hidden. Maybe users do not care about the dashboard section you spent time designing. Maybe the AI summary is useful, but the suggested reply feels too risky. Maybe the new flow removes a step that users quietly depended on.</p>

<p>It is much cheaper to learn that in a prototype than after a production release.</p>

<p>For new products, Figma Make helps validate an MVP. For existing products, it helps validate modernization.</p>

<h2>
  
  
  Figma MCP makes design-to-code less vague
</h2>

<p>Design-to-code has always had a translation problem.</p>

<p>A designer creates a screen. A developer interprets it. Something gets lost. Spacing changes. Components get duplicated. States are forgotten. A table gets rebuilt from scratch even though the app already has one. A modal looks almost like the design system, but not quite.</p>

<p>AI can make this problem worse if it only works from screenshots or vague prompts.</p>

<p>That is why the Figma MCP Server is important.</p>

<p>It gives AI coding agents access to real design context: selected frames, components, variables, layout structure, and design data. Instead of asking an agent to guess what the interface should be, you give it a structured source of truth.</p>

<p>This is especially useful in modernization because the agent needs to understand two worlds at the same time: the existing Laravel application and the new design direction.</p>

<p>If it only understands the old code, it may preserve bad patterns. If it only understands the new design, it may produce code that does not fit the real application. But when it has both design context and codebase context, it can make more precise changes.</p>

<p>That is when AI becomes useful in real projects.</p>

<p>Not as a magic generator, but as a context-aware assistant.</p>

<h2>
  
  
  Code Connect helps prevent component chaos
</h2>

<p>One of the easiest ways to damage a codebase with AI is to let it create duplicate components.</p>

<p>A new button. A new card. A new modal. A new table. A new dropdown. A new form pattern. None of them are terrible alone, but together they create a maintenance problem.</p>

<p>After a few weeks, the app may look “AI-modernized,” but the codebase is harder to maintain than before.</p>

<p>Code Connect helps by linking Figma components to real code components. This matters when a team already has a design system or component library.</p>

<p>The button in Figma should map to the real button in code. The modal should use the existing modal. The table should follow the existing table pattern. The badge should not be recreated five different ways.</p>

<p>In a new product, this keeps things clean from the beginning. In a legacy product, it is even more important because modernization should reduce inconsistency, not add more.</p>

<p>AI agents need boundaries. A connected design system gives them those boundaries.</p>

<h2>
  
  
  AI coding agents are best at controlled changes
</h2>

<p>AI coding agents are powerful, but they are not magic. They work best when the task is specific, the context is strong, and the change is small enough to review.</p>

<p>Cursor, GitHub Copilot Agent Mode, and Claude Code can all be useful in this workflow. The specific tool matters less than the process.</p>

<p>A good process starts with understanding. Ask the agent to inspect the existing code. Ask it to explain how the feature works today. Ask it to identify risks. Ask it to create a plan before editing files. Then let it implement one small slice, run tests, review the diff, and continue.</p>

<p>A bad process is telling the agent to “refactor the whole dashboard.”</p>

<p>That is how you get chaos.</p>

<p>In a legacy Laravel application, an AI agent should behave like a careful developer joining an existing team. First it reads. Then it plans. Then it changes one thing. Then it proves the change works.</p>

<p>That is the difference between AI-assisted engineering and an AI-generated mess.</p>

<h2>
  
  
  Laravel is a strong base because it has structure
</h2>

<p>Laravel fits this workflow well because it is opinionated.</p>

<p>Routes have a place. Controllers have a place. Models have a place. Migrations have a place. Policies have a place. Jobs have a place. Tests have a place.</p>

<p>That structure helps humans, but it also helps AI agents.</p>

<p>AI performs better when the framework has conventions. It has less to guess. It can inspect the application and understand the shape of the project faster.</p>

<p>For new products, Laravel gives you speed. Authentication, database models, queues, notifications, events, policies, jobs, tests, file storage, and deployment paths are already part of the ecosystem.</p>

<p>For old products, Laravel gives you a map. Even if the application is messy, there is usually still a recognizable structure. That makes modernization easier than working inside a completely custom system with no conventions.</p>

<p>Laravel Boost makes this even more useful because it gives AI agents Laravel-specific context and documentation awareness. That matters because generic AI advice can be wrong, especially when your project uses specific Laravel versions or package versions.</p>

<p>Modernization is not just about writing new code. It is about writing the right code for the application that already exists.</p>

<h2>
  
  
  Laravel AI SDK turns AI into product behavior
</h2>

<p>Once the workflow and backend are clear, you can add AI features where they make sense.</p>

<p>This is where Laravel AI SDK becomes useful. It helps bring AI into the application layer instead of treating it like a separate experiment.</p>

<p>That distinction matters.</p>

<p>A demo can send a prompt to a model and display a response. A real product needs users, permissions, database records, queues, logs, retries, review states, cost control, and tests.</p>

<p>For example, in an old support dashboard, the first AI feature should not be a general assistant that tries to do everything. It should be narrow and useful.</p>

<p>Summarize this ticket. Classify the issue. Detect urgency. Suggest the next action. Draft a reply for human review.</p>

<p>That is product behavior. It is useful, measurable, and testable.</p>

<p>The AI should not take over the workflow. It should make the workflow faster.</p>

<h2>
  
  
  Modernization should happen one slice at a time
</h2>

<p>The biggest trap in legacy work is the big rewrite.</p>

<p>Teams look at an old product and say, “Let’s rebuild everything.”</p>

<p>It sounds exciting. It usually fails.</p>

<p>The safer approach is vertical modernization. Pick one painful workflow, redesign it, prototype it, build it, ship it, measure it, and then move to the next one.</p>

<p>Do not modernize the entire admin panel at once. Start with the customer profile page, the billing history screen, the support ticket detail flow, or the internal reporting dashboard.</p>

<p>A vertical slice includes the UI, backend behavior, permissions, data model, tests, and deployment. It is small enough to ship, but complete enough to matter.</p>

<p>This is where AI gives real leverage. It helps you audit faster, design faster, prototype faster, plan faster, refactor faster, test faster, and review faster.</p>

<p>But it still needs discipline.</p>

<p>AI lowers the cost of modernization. It does not remove the need for engineering judgment.</p>

<h2>
  
  
  A real example: upgrading an old support dashboard
</h2>

<p>Imagine a SaaS company has an old support dashboard built in Laravel.</p>

<p>It works, but barely. The ticket table has too many columns. Filters are confusing. The detail page is crowded. There is no clear priority system. Support managers waste time reading every message manually. The UI looks outdated, but the workflow is too important to rewrite all at once.</p>

<p>A smart modernization would start with an audit.</p>

<p>What do support managers actually do every morning? Which tickets need immediate attention? What information do they need before replying? Which fields are just noise? Which actions happen repeatedly?</p>

<p>Then the team redesigns that flow in Figma. The new version has a cleaner inbox, better filters, clear priority labels, a focused ticket detail page, and an AI summary panel.</p>

<p>Then they use Figma Make to prototype the interaction. Support managers can click through the new flow before developers rebuild it. They can react to the new layout, the AI summary, the suggested reply, and the approval flow.</p>

<p>Then the team connects Figma to the coding agent through MCP. The agent inspects the Laravel app and the selected Figma design. It explains the current implementation, identifies the files involved, and proposes a safe plan.</p>

<p>Then the team ships only one slice: the new ticket detail page behind a feature flag.</p>

<p>After that, they add one AI feature: ticket summarization. Not auto-send. Not full automation. Not a magic support robot. Just a focused improvement that saves time and keeps the human in control.</p>

<p>That is how real modernization happens.</p>

<h2>
  
  
  AI should improve the product, not create a side quest
</h2>

<p>The best AI features feel native.</p>

<p>They do not make the user leave the screen. They do not force the user into a chat interface. They do not require a new mental model. They do not add complexity just to look impressive.</p>

<p>They make the current workflow faster.</p>

<p>In a CRM, AI can summarize an account before a sales call. In a dashboard, AI can explain why a metric changed. In a document system, AI can extract structured fields. In a support tool, AI can classify tickets and draft replies. In an internal admin panel, AI can help operators find records, detect anomalies, or complete repetitive tasks.</p>

<p>That is the mindset shift.</p>

<p>Do not ask, “Where can we add AI?”</p>

<p>Ask, “Where does the user lose time?”</p>

<p>Then use AI there.</p>

<h2>
  
  
  The rules for using AI in legacy code
</h2>

<p>AI needs guardrails, especially in old products.</p>

<p>Do not let the agent rewrite unrelated files. Do not let it introduce a new frontend framework casually. Do not let it create duplicate components. Do not let it change database schema without a clear migration plan. Do not let it bypass authorization. Do not let it access data across tenants. Do not let it automate destructive actions without approval. Do not trust a refactor without tests.</p>

<p>These rules are not bureaucracy. They are how you use AI in production without creating new problems.</p>

<p>The best teams will not be the ones that generate the most code. They will be the ones that generate the most useful change with the least risk.</p>

<h2>
  
  
  The new stack for product modernization
</h2>

<p>A modern AI-assisted workflow brings several tools together.</p>

<p>Figma helps redesign the product experience. Figma AI helps explore directions and clean up old interfaces. Figma Make helps test functional prototypes before production work begins. Figma MCP Server brings design context into coding tools. Code Connect maps design components to real code components.</p>

<p>On the engineering side, tools like Cursor, GitHub Copilot Agent Mode, and Claude Code help with planning, implementation, testing, and review. Laravel provides the real application layer: users, permissions, database models, queues, events, notifications, tests, and deployment. Laravel Boost gives AI agents Laravel-specific context. Laravel AI SDK helps build AI features inside the product itself.</p>

<p>This stack works for new startups, but it may be even more powerful for existing products.</p>

<p>Because the world does not only need more new apps.</p>

<p>It needs better versions of the apps companies already depend on.</p>

<h2>
  
  
  The real leverage
</h2>

<p>AI will not make product thinking irrelevant. It will not remove bad architecture. It will not fix a broken workflow automatically. It will not replace senior engineering judgment.</p>

<p>But it changes the economics of improvement.</p>

<p>For years, many teams avoided modernization because it felt too expensive. The old system was ugly, but it worked. The code was messy, but risky to change. The UI was outdated, but rebuilding it sounded like a six-month project.</p>

<p>AI changes that.</p>

<p>Not by making modernization easy, but by making it incremental.</p>

<p>You can redesign one flow, prototype it, validate it, connect it to code, refactor one slice, add one useful AI feature, ship it, and repeat.</p>

<p>That is the playbook.</p>

<p>The next great AI products will not all start from empty repositories. Some will start inside old Laravel apps, outdated dashboards, internal tools, and legacy workflows that already matter.</p>

<p>The opportunity is not only to launch something new.</p>

<p>The opportunity is to make old software feel new again.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[„Stranger Things“-Star verrät Geheimnis: Nur 3 Personen wissen wirklich, was mit Eleven geschah]]></title>
<description><![CDATA[„Stranger Things“ ließ mit der fünften und letzten Staffel viele Herzen brechen. Die Fan-Theorien waren wild – und noch wilder die Spekulationen um das Schicksal von Millie Bobby Browns Eleven.]]></description>
<link>https://tsecurity.de/de/3624628/it-nachrichten/stranger-things-star-verraet-geheimnis-nur-3-personen-wissen-wirklich-was-mit-eleven-geschah/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3624628/it-nachrichten/stranger-things-star-verraet-geheimnis-nur-3-personen-wissen-wirklich-was-mit-eleven-geschah/</guid>
<pubDate>Thu, 25 Jun 2026 15:17:50 +0200</pubDate>
<content:encoded><![CDATA[„Stranger Things“ ließ mit der fünften und letzten Staffel viele Herzen brechen. Die Fan-Theorien waren wild – und noch wilder die Spekulationen um das Schicksal von Millie Bobby Browns Eleven.]]></content:encoded>
</item>
<item>
<title><![CDATA[Charlie Brown’s longtime pen pal finally revealed in new Apple TV ‘Snoopy Unleashed’ movie]]></title>
<description><![CDATA["Snoopy Unleashed," from WildBrain Studios, is a new family film coming soon to Apple TV. When Snoopy runs away from home, Charlie Brown…
The post Charlie Brown’s longtime pen pal finally revealed in new Apple TV ‘Snoopy Unleashed’ movie appeared first on MacDailyNews.]]></description>
<link>https://tsecurity.de/de/3622245/apple-ios-macos/charlie-browns-longtime-pen-pal-finally-revealed-in-new-apple-tv-snoopy-unleashed-movie/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3622245/apple-ios-macos/charlie-browns-longtime-pen-pal-finally-revealed-in-new-apple-tv-snoopy-unleashed-movie/</guid>
<pubDate>Wed, 24 Jun 2026 19:10:28 +0200</pubDate>
<content:encoded><![CDATA[<p>"Snoopy Unleashed," from WildBrain Studios, is a new family film coming soon to Apple TV. When Snoopy runs away from home, Charlie Brown…</p>
<p>The post <a href="https://tsecurity.de/weiterlesen/3594106/3622245/charlie-browns-longtime-pen-pal-finally-revealed-in-new-apple-tv-snoopy-unleashed-movie/" target="_blank" rel="noopener noreferrer">Charlie Brown’s longtime pen pal finally revealed in new Apple TV ‘Snoopy Unleashed’ movie</a> appeared first on <a href="https://tsecurity.de/weiterlesen/3594106/3622245/charlie-browns-longtime-pen-pal-finally-revealed-in-new-apple-tv-snoopy-unleashed-movie/" target="_blank" rel="noopener noreferrer">MacDailyNews</a>.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[The Trump White House Is Over Anthropic's Dario Amodei]]></title>
<description><![CDATA[At high-stakes meetings with the White House, Anthropic's CEO—a "weirdo," per one official—has been replaced by cofounder Tom Brown.]]></description>
<link>https://tsecurity.de/de/3621863/it-nachrichten/the-trump-white-house-is-over-anthropics-dario-amodei/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3621863/it-nachrichten/the-trump-white-house-is-over-anthropics-dario-amodei/</guid>
<pubDate>Wed, 24 Jun 2026 17:19:19 +0200</pubDate>
<content:encoded><![CDATA[At high-stakes meetings with the White House, Anthropic's CEO—a "weirdo," per one official—has been replaced by cofounder Tom Brown.]]></content:encoded>
</item>
<item>
<title><![CDATA[Trust Is Not a Feature]]></title>
<description><![CDATA[Somewhere between the press releases and the product demos, something went quietly wrong with explainable AI. What began as a serious academic and civil liberties concern about algorithmic opacity has been repackaged, polished, and slotted neatly into enterprise software brochures. The question o...]]></description>
<link>https://tsecurity.de/de/3621121/sichere-programmierung/trust-is-not-a-feature/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3621121/sichere-programmierung/trust-is-not-a-feature/</guid>
<pubDate>Wed, 24 Jun 2026 13:12:45 +0200</pubDate>
<content:encoded><![CDATA[<p>Somewhere between the press releases and the product demos, something went quietly wrong with explainable AI. What began as a serious academic and civil liberties concern about algorithmic opacity has been repackaged, polished, and slotted neatly into enterprise software brochures. The question of whether people deserve to understand why a machine denied them healthcare, flagged them as a fraud risk, or recommended a longer prison sentence has been quietly reframed. It is no longer about rights. It is about features.</p>

<p>The global explainable AI market was valued at approximately 7.79 billion US dollars in 2024, according to Grand View Research, and is projected to reach 21.06 billion dollars by 2030. These are not the figures of a civil liberties movement. This is a growth industry. And the distinction matters enormously, because the people building these tools and the people most harmed by opaque algorithms are almost never the same people. The explainability that corporations are selling is designed for boardrooms and compliance departments, not for the individuals whose lives hang in the balance of an algorithmic output.</p>

<h2>
  
  
  When the Algorithm Decides Your Future
</h2>

<p>To understand why explainability matters, you need only look at what happens when it is absent. In Australia, the Robodebt scheme ran from 2016 to 2019, deploying an automated data-matching algorithm to calculate welfare debts by averaging annual income across fortnights. The method was mathematically crude and, as a 2019 Federal Court ruling determined, legally invalid. No warrant existed in social security law that entitled the administering agency to use income averaging as a proxy for actual income in fortnightly measurement periods. This was known internally because of legal advice received by the Department of Social Security as early as 2014. Yet the algorithm asserted 1.7 billion Australian dollars in debts against 453,000 people. A total of 746 million Australian dollars was wrongfully recovered from 381,000 individuals before the scheme was finally dismantled. The Royal Commission, established in August 2022 under Prime Minister Anthony Albanese, heard testimony from families of young people who had died by suicide after receiving algorithmically generated debt notices they could not understand or contest.</p>

<p>At the height of the scheme in 2017, 20,000 debt notices were being issued per week. None of them came with a meaningful explanation of how the debt had been calculated. The University of Melbourne described the core flaw plainly: averaging a year's worth of earnings across each fortnight is no way to accurately calculate fortnightly pay, particularly for casual workers whose income fluctuates. Yet the system operated for years, with human oversight progressively removed from the process. The Oxford University Blavatnik School of Government described Robodebt as “a tragic case of public policy failure,” one in which the efficiency benefits of automation were pursued without regard for legal authority, ethical safeguards, or the basic dignity of the people affected. In September 2024, the Australian Public Service Commission concluded its investigation, resulting in fines and demotions for several officials, though notably no one was dismissed from their role.</p>

<p>The Netherlands offers another instructive case. The Dutch childcare benefits scandal, which ultimately forced the government's resignation in January 2021, involved an algorithmic system that flagged benefit claims as potentially fraudulent. A report by the Dutch Data Protection Authority revealed that the system used a self-learning algorithm where dual nationality and foreign-sounding names functioned as indicators of fraud risk. Tens of thousands of parents, predominantly from ethnic minority and low-income backgrounds, were falsely accused and forced to repay legally obtained benefits. Amnesty International's 2021 report, titled “Xenophobic Machines,” described the outcome as a “black box system” that created “a black hole of accountability.” The Dutch government publicly acknowledged in May 2022 that institutional racism within the Tax and Customs Administration was a root cause.</p>

<p>These are not hypothetical scenarios. They are documented failures with named victims, legal findings, and parliamentary consequences. And in every case, the absence of explainability was not a minor technical limitation. It was the mechanism through which harm was inflicted and accountability was evaded.</p>

<h2>
  
  
  The Quiet Rebranding of a Democratic Demand
</h2>

<p>The academic roots of explainable AI are firmly planted in concerns about justice, accountability, and democratic governance. Cathy O'Neil's 2016 book “Weapons of Math Destruction” identified three defining characteristics of harmful algorithmic systems: opacity, scale, and damage. O'Neil, who holds a PhD in mathematics from Harvard University and founded the algorithmic auditing company ORCAA, argued that mathematical models encoding human prejudice were being deployed at scale without any mechanism for those affected to understand or challenge the decisions made about them. As she wrote, “the math-powered applications powering the data economy were based on choices made by fallible human beings,” and many of those choices “encoded human prejudice, misunderstanding, and bias into the software systems that increasingly managed their lives.”</p>

<p>That argument was fundamentally about power. It asked who gets to know, who gets to question, and who gets to change the systems that shape lives. But somewhere in the translation from academic critique to enterprise software, the language shifted. Explainability stopped being a demand made by citizens and became a capability offered by vendors.</p>

<p>IBM now markets AI Explainability 360 as an open-source toolkit, and its watsonx.governance platform promises to “accelerate responsible and explainable AI workflows.” Microsoft offers InterpretML and Fairlearn as part of its Responsible AI toolkit. Google's Vertex AI platform includes explainability features as standard enterprise offerings. These are not trivial contributions. The technical work behind SHAP values, LIME interpretations, and attention visualisations represents genuine scientific progress. But the framing has fundamentally changed. Explainability is positioned as a competitive advantage for organisations, not as a right belonging to the individuals whose lives are affected by algorithmic decisions.</p>

<p>The Stanford AI Index Report 2024 found that 44 per cent of surveyed organisations identified transparency and explainability as key concerns regarding AI adoption. But look at that statistic carefully. It measures corporate concern about adoption barriers, not citizen concern about algorithmic justice. The worry is that unexplainable AI might slow enterprise deployment, not that it might harm people. Meanwhile, the same report noted that 233 documented AI-related incidents occurred in 2024, a figure that represents not merely a statistical increase but what Stanford described as “a fundamental shift in the threat landscape facing organisations that deploy AI systems.”</p>

<h2>
  
  
  Healthcare Algorithms and the 90 Per Cent Error Rate
</h2>

<p>Perhaps nowhere is the tension between corporate explainability-as-feature and citizen explainability-as-right more acute than in healthcare. In November 2023, a class action lawsuit was filed against UnitedHealth Group alleging that its subsidiary NaviHealth used an AI algorithm called nH Predict to deny elderly patients medically necessary post-acute care. The lawsuit claimed the algorithm had a 90 per cent error rate, based on the proportion of denials that were reversed on appeal, and that UnitedHealth pressured clinical employees to keep patient rehabilitation stays within one per cent of the algorithm's projections. Internal documents revealed that managers set explicit targets for clinical staff to adhere to the algorithm's output, creating a system in which machine-generated projections effectively overruled physician judgment.</p>

<p>UnitedHealth responded that nH Predict was not used to make coverage decisions but rather served as “a guide to help us inform providers, families and other caregivers about what sort of assistance and care the patient may need.” As of February 2025, a federal court denied UnitedHealth's motion to dismiss, allowing breach of contract and good faith claims to proceed. The case remains in pretrial discovery. According to STAT News, the nH Predict algorithm is not limited to UnitedHealth; Humana and several regional health plans also use it, making the implications of this case far broader than a single insurer.</p>

<p>In a separate case filed in July 2023, patients sued Cigna alleging that its PXDX algorithm enabled doctors to automatically deny claims without opening patient files. The lawsuit claimed that Cigna denied more than 300,000 claims in a two-month period, a rate that works out to roughly 1.2 seconds per claim for physician review.</p>

<p>These lawsuits raise a pointed question. If a corporation offers explainable AI as a product feature while simultaneously deploying opaque algorithms to deny healthcare coverage, what exactly is being explained, and to whom? The enterprise customer gets a dashboard and a transparency report. The elderly patient in a nursing home gets a denial letter.</p>

<p>In February 2024, the US Centers for Medicare and Medicaid Services issued guidance clarifying that while algorithms can assist in predicting patient needs, they cannot solely dictate coverage decisions. That guidance implicitly acknowledged what the lawsuits alleged explicitly: that the line between algorithmic recommendation and algorithmic decision had been deliberately blurred. California subsequently enacted SB1120 in September 2024, effective January 2025, regulating how AI-enabled tools can be used for processing healthcare claims, with several other states including New York, Pennsylvania, and Georgia considering similar legislation.</p>

<h2>
  
  
  Credit Scoring and the Invisible Architecture of Algorithmic Lending
</h2>

<p>The financial services sector presents another domain where the gap between corporate explainability and citizen understanding is widening. A 2024 Urban Institute analysis of Home Mortgage Disclosure Act data found that Black and Brown borrowers were more than twice as likely to be denied a loan as white borrowers. A 2022 study from UC Berkeley on fintech lending found that African American and Latinx borrowers were charged nearly five basis points in higher interest rates than their credit-equivalent white counterparts, amounting to an estimated 450 million dollars in excess interest payments annually.</p>

<p>Research from Lehigh University tested leading large language models on loan applications and found that LLMs consistently recommended denying more loans and charging higher interest rates to Black applicants compared to otherwise identical white applicants. White applicants were 8.5 per cent more likely to be approved. For applicants with lower credit scores of 640, the gap was even starker: white applicants were approved 95 per cent of the time, while Black applicants with the same financial profile were approved less than 80 per cent of the time.</p>

<p>Stanford's Human-Centered Artificial Intelligence programme identified a deeper structural problem. Their research revealed substantially more “noise” or misleading data in the credit scores of people from minority and low-income households. Scores for minorities were approximately five per cent less accurate in predicting default risk, and scores for those in the bottom fifth of income were roughly 10 per cent less predictive than those for higher-income borrowers. The implication is profound: even a technically perfect explainable AI system, one that faithfully reports why a particular decision was made, would be explaining decisions based on fundamentally flawed data. Fairer algorithms, the Stanford researchers argued, cannot fix a problem rooted in the quality and completeness of the underlying information.</p>

<p>In October 2024, the Consumer Financial Protection Bureau fined Apple 25 million dollars and Goldman Sachs 45 million dollars for failures related to the Apple Card, demonstrating that algorithmic transparency issues in financial services carry real regulatory consequences. The CFPB made its position explicit in an August 2024 comment to the Treasury Department: “There are no exceptions to the federal consumer financial protection laws for new technologies.”</p>

<h2>
  
  
  Criminal Justice and the Fairness Paradox
</h2>

<p>The COMPAS algorithm, developed by Northpointe (now Equivant), has been used across US courts to assess the likelihood that a defendant will reoffend. In 2016, ProPublica published an investigation based on analysis of risk scores assigned to 7,000 people arrested in Broward County, Florida. The findings were stark. Black defendants were 77 per cent more likely to be flagged as higher risk of committing a future violent crime and 45 per cent more likely to be predicted to commit any future crime, even after controlling for criminal history, age, and gender. Black defendants were also almost twice as likely as white defendants to be labelled higher risk but not actually reoffend, while white defendants were much more likely to be labelled lower risk but subsequently commit other crimes.</p>

<p>Northpointe countered that the algorithm's accuracy rate of approximately 60 per cent was the same for Black and white defendants, arguing that equal predictive accuracy constitutes fairness. This claim prompted researchers at Stanford, Cornell, Harvard, Carnegie Mellon, the University of Chicago, and Google to investigate. They discovered what has since become known as the fairness paradox: when two groups have different base rates of arrest, an algorithm calibrated for equal predictive accuracy will inevitably produce disparities in false positive rates. Mathematical fairness, they concluded, cannot satisfy all definitions of fairness simultaneously.</p>

<p>Tim Brennan, one of the COMPAS creators, acknowledged the difficulty publicly, noting that omitting factors correlated with race, such as poverty, joblessness, and social marginalisation, reduces accuracy. The system, in other words, is accurate precisely because it encodes structural inequality. Explaining how COMPAS works does not make it fair. It simply makes the unfairness more visible, assuming anyone is looking. In Kentucky, legislators responded to these concerns by enacting H.B. 366 in 2024, limiting how algorithm or risk assessment tool scores may be used in criminal justice proceedings.</p>

<p>This is the deeper problem with treating explainability as a feature. A fully explainable system that faithfully reproduces discriminatory patterns is not a just system. It is a transparent injustice. And selling transparency tools without addressing the underlying fairness problem is, at best, incomplete and, at worst, a form of sophisticated misdirection.</p>

<h2>
  
  
  The Regulatory Patchwork and Its Widening Gaps
</h2>

<p>Europe has made the most ambitious attempt to legislate algorithmic explainability. The EU AI Act, which entered into force in stages beginning in 2024, establishes a risk-based framework categorising AI systems from minimal to unacceptable risk. Article 13 requires that high-risk AI systems be “designed and developed in such a way as to ensure that their operation is sufficiently transparent to enable deployers to interpret a system's output and use it appropriately.” Article 86 creates an individual right to explanation for decisions made by high-risk AI systems that significantly affect health, safety, or fundamental rights.</p>

<p>The General Data Protection Regulation, in force since 2018, already contained the seeds of this approach. Article 22 of the GDPR establishes a general prohibition on decisions based solely on automated processing that produce legal effects or similarly significant impacts. Articles 13 through 15 require organisations to provide “meaningful information about the logic involved” in automated decision-making. The UK Information Commissioner's Office has issued detailed guidance on these provisions, emphasising that a superficial or rubber-stamp human review does not satisfy the requirement for meaningful human involvement.</p>

<p>In the United States, the legislative approach has been markedly slower. The Algorithmic Accountability Act, first introduced in 2019 by Senator Ron Wyden, Senator Cory Booker, and Representative Yvette Clarke, has been reintroduced in each subsequent Congress, most recently in 2025 as both S.2164 in the Senate and H.R.5511 in the House. The bill would require large companies to conduct impact assessments of automated decision systems used in high-stakes domains including housing, employment, credit, and education. The Electronic Privacy Information Center and other civil society organisations have endorsed the 2025 version. Yet the bill has never received a floor vote. The statistical reality is sobering: only about 11 per cent of bills introduced in Congress make it past committee, and approximately two per cent are enacted into law.</p>

<p>Yet even the European framework has practical limitations. The EU AI Act's explainability requirements remain, as several legal scholars have noted, abstract. They do not specify precise metrics, testing protocols, or minimum standards for what constitutes a sufficient explanation. A corporation can comply with the letter of Article 13 by providing technical documentation that is impenetrable to the average person whose loan application was rejected or whose benefit claim was denied. The right to explanation exists on paper, but the explanation itself may be functionally useless to the person who needs it most.</p>

<p>The Dutch SyRI case illustrates both the promise and limits of legal intervention. In February 2020, the District Court of The Hague ruled that the System Risk Indication, a government fraud-detection system that had been cross-referencing citizens' personal data across multiple databases since 2014, failed to strike a fair balance between fraud detection and the human right to privacy. The Dutch government did not appeal, and SyRI was banned. But as investigative outlet Lighthouse Reports subsequently discovered, a slightly adapted version of the same algorithm quietly continued operating in some of the country's most vulnerable neighbourhoods.</p>

<p>Legal rights, it turns out, are only as strong as the enforcement mechanisms behind them. And when the entities deploying opaque algorithms are also among the most powerful institutions in society, whether governments or multinational corporations, enforcement becomes a question of political will rather than legal architecture.</p>

<h2>
  
  
  The Corporate Incentive Structure Problem
</h2>

<p>There is a fundamental misalignment between what corporations mean when they say “explainable AI” and what citizens need when an algorithm makes a decision about their life. For corporations, explainability serves several functions: regulatory compliance, risk management, debugging efficiency, and marketing differentiation. IBM's watsonx.governance platform explicitly positions itself as helping enterprises “accelerate responsible and explainable AI workflows.” Microsoft's Responsible AI Standard is marketed as giving organisations “trust from highly regulated industries.” Google's Vertex AI emphasises seamless integration with existing enterprise data infrastructure.</p>

<p>None of this is inherently dishonest. These tools do real technical work. But they are designed to serve the interests of the organisation deploying the AI, not the individual subjected to its decisions. The enterprise customer receives model interpretability dashboards, feature importance rankings, and compliance documentation. The person whose mortgage application was declined, whose insurance claim was denied, or whose parole was refused receives, at most, a letter stating that a decision has been made.</p>

<p>The Stanford AI Index Report 2024 found that the number of AI-related regulations in the United States rose from just one in 2016 to 25 in 2023. Globally, the regulatory landscape is expanding rapidly. Yet the same report noted that leading AI developers still lack transparency, with scores on the Foundation Model Transparency Index averaging just 58 per cent in May 2024, and then declining back to approximately 41 per cent in 2025, effectively reversing the previous year's progress.</p>

<p>The market responds to incentives. When explainability is primarily valued as a compliance tool and a market differentiator, the incentive is to produce the minimum viable explanation, one that satisfies regulators and reassures enterprise buyers, rather than the maximum useful explanation, one that genuinely empowers the affected individual to understand and challenge the decision.</p>

<h2>
  
  
  Silenced Voices and Structural Resistance
</h2>

<p>The people best positioned to challenge this dynamic from within the technology industry have often faced significant consequences for doing so. In December 2020, Timnit Gebru, the technical co-lead of Google's Ethical AI team, announced that she had been forced out of the company. The dispute centred on a research paper she co-authored, titled “On the Dangers of Stochastic Parrots: Can Language Models Be Too Big?“, which examined the risks of large language models, including the reproduction of biased and discriminatory language from training data and the environmental costs of massive computational resources.</p>

<p>Gebru, who holds a PhD from Stanford and co-founded Black in AI, had previously co-authored landmark research with Joy Buolamwini at MIT demonstrating that facial recognition systems from IBM and Microsoft exhibited significantly higher error rates when identifying darker-skinned individuals. That 2018 paper, “Gender Shades,” published at the Conference on Fairness, Accountability, and Transparency, found that facial recognition misidentified Black women at rates up to 35 per cent higher than white men. The research played a direct role in Amazon, IBM, and Microsoft subsequently pulling facial recognition technology from law enforcement use during the 2020 protests following the killing of George Floyd.</p>

<p>Google's head of AI research at the time, Jeff Dean, stated that Gebru's paper “didn't meet our bar for publication.” More than 1,200 Google employees signed an open letter calling the incident “unprecedented research censorship.” An additional 4,500 people, including researchers at DeepMind, Microsoft, Apple, Facebook, and Amazon, signed a letter demanding transparency. Two Google employees subsequently resigned over the matter. As the Brookings Institution noted, because AI systems are typically built with proprietary data and are often accessible only to employees of large technology companies, internal ethicists sometimes represent the only check on whether these systems are being responsibly deployed.</p>

<p>Gebru went on to found the Distributed AI Research Institute, an independent laboratory free from corporate influence. But her departure highlighted a structural problem that no amount of enterprise explainability tooling can address. When the organisations building AI systems also control the research agenda, the funding pipelines, and the publication processes, internal accountability becomes fragile. And when that fragile accountability breaks down, the people who suffer are not the shareholders or the enterprise customers. They are the individuals and communities at the sharp end of algorithmic decision-making.</p>

<h2>
  
  
  What Genuine Algorithmic Accountability Would Require
</h2>

<p>If explainability is to function as a genuine safeguard rather than a marketing feature, several structural changes would be necessary. First, the right to explanation must be defined in terms that are meaningful to the person receiving the explanation, not merely to the organisation providing it. A compliance document written in technical jargon for a regulatory filing is not an explanation in any meaningful democratic sense. The EU AI Act's Article 86 gestures towards this principle by requiring “clear and meaningful explanations,” but without specific standards for clarity and meaning, the provision risks becoming another box to tick.</p>

<p>Second, independent algorithmic auditing needs to become routine, mandatory, and publicly transparent. Cathy O'Neil's ORCAA represents one model, but algorithmic auditing remains largely voluntary and commercially driven. The entities most in need of scrutiny, those deploying AI in healthcare, criminal justice, welfare administration, and financial services, should be subject to mandatory external audits with publicly published results, much as financial institutions are subject to independent accounting audits.</p>

<p>Third, the technical capacity for explainability must be matched by institutional capacity for contestability. An explanation is only useful if the person receiving it has a realistic mechanism to challenge the decision. The UnitedHealth nH Predict lawsuit revealed that the company allegedly operated with the knowledge that only 0.2 per cent of denied patients would file appeals. When the appeals process is sufficiently onerous, the right to contest becomes theoretical rather than practical.</p>

<p>Fourth, the conversation about explainability must be reconnected to the conversation about fairness. The COMPAS fairness paradox demonstrated that transparency alone does not resolve structural discrimination. A perfectly explainable system that reproduces racial disparities is not a success story. It is a more legible failure. Explainability without fairness is surveillance dressed in democratic clothing. And the Stanford research on credit scoring noise demonstrates that even perfectly transparent systems produce misleading outputs when the underlying data is itself corrupted by historical discrimination.</p>

<p>Finally, the research community working on these questions needs structural independence from the corporations whose systems they are evaluating. The departure of Timnit Gebru from Google, and the subsequent departures of other ethics researchers from major technology companies, revealed the tension between corporate interests and independent scrutiny. Public funding for independent AI research, housed in universities and civil society organisations rather than corporate laboratories, is not a luxury. It is a prerequisite for credible accountability.</p>

<h2>
  
  
  The Trust Deficit That Technology Cannot Solve
</h2>

<p>The Ipsos survey cited in the Stanford AI Index Report 2024 found that 52 per cent of people globally express nervousness about AI products and services, a 13 percentage point increase from 2022. Pew Research data from the same period showed that 52 per cent of Americans feel more concerned than excited about AI, up from 37 per cent in 2022. Trust in AI companies to protect personal data fell from 50 per cent in 2023 to 47 per cent in 2024.</p>

<p>These numbers reflect something that no amount of explainability tooling can fix on its own. The trust deficit is not primarily a technical problem. It is a political and institutional problem. People do not distrust AI because they lack access to SHAP values and feature importance plots. They distrust AI because they have watched algorithms falsely accuse thousands of Australian welfare recipients of fraud, discriminate against ethnic minorities in Dutch benefit assessments, deny elderly Americans medically necessary care, charge Black and Latino borrowers higher interest rates on identical loan profiles, and assign higher risk scores to Black defendants in American courts.</p>

<p>Trust is not a product feature. It is not something that can be engineered into a dashboard or bundled into an enterprise software licence. Trust is earned through demonstrated accountability, genuine transparency, meaningful contestability, and consistent consequences when systems cause harm. Until the conversation about explainable AI shifts from what corporations can sell to what citizens are owed, the transparency will remain largely illusory, a well-lit window into a process that nobody with real power intends to change.</p>

<p>The XAI market will continue growing towards its projected 21 billion dollars by 2030. The enterprise dashboards will become more sophisticated. The compliance documentation will become more thorough. But unless explainability is treated as a fundamental democratic right rather than a premium product feature, the people who most need to understand why an algorithm changed their life will remain the last to know.</p>




<h2>
  
  
  References and Sources
</h2>

<ol>
<li><p>Grand View Research, “Explainable AI Market Size and Share Report, 2030,” grandviewresearch.com, 2024.</p></li>
<li><p>Royal Commission into the Robodebt Scheme, Commonwealth of Australia, Letters Patent issued 25 August 2022, published 2023.</p></li>
<li><p>University of Melbourne, “The Flawed Algorithm at the Heart of Robodebt,” pursuit.unimelb.edu.au, 2023.</p></li>
<li><p>Oxford University Blavatnik School of Government, “Australia's Robodebt Scheme: A Tragic Case of Public Policy Failure,” bsg.ox.ac.uk, 2023.</p></li>
<li><p>Australian Public Service Commission, Investigation Findings on Robodebt Officials, September 2024.</p></li>
<li><p>Amnesty International, “Xenophobic Machines: Discrimination Through Unregulated Use of Algorithms in the Dutch Childcare Benefits Scandal,” amnesty.org, October 2021.</p></li>
<li><p>Dutch Data Protection Authority (Autoriteit Persoonsgegevens), investigation report on the childcare benefits algorithm, 2020.</p></li>
<li><p>Cathy O'Neil, “Weapons of Math Destruction: How Big Data Increases Inequality and Threatens Democracy,” Crown Publishing, 2016.</p></li>
<li><p>Stanford University Human-Centered Artificial Intelligence, “AI Index Report 2024” and Foundation Model Transparency Index v1.1, hai.stanford.edu, 2024.</p></li>
<li><p>STAT News, “UnitedHealth Faces Class Action Lawsuit Over Algorithmic Care Denials in Medicare Advantage Plans,” statnews.com, November 2023.</p></li>
<li><p>Healthcare Finance News, “Class Action Lawsuit Against UnitedHealth's AI Claim Denials Advances,” healthcarefinancenews.com, February 2025.</p></li>
<li><p>ProPublica, “Machine Bias: There's Software Used Across the Country to Predict Future Criminals. And It's Biased Against Blacks,” and “Bias in Criminal Risk Scores Is Mathematically Inevitable, Researchers Say,” propublica.org, 2016.</p></li>
<li><p>European Parliament and Council of the European Union, “Regulation (EU) 2024/1689 Laying Down Harmonised Rules on Artificial Intelligence (AI Act),” Official Journal of the European Union, 2024.</p></li>
<li><p>European Parliament and Council of the European Union, “General Data Protection Regulation (GDPR),” Regulation (EU) 2016/679, 2016.</p></li>
<li><p>UK Information Commissioner's Office, “Rights Related to Automated Decision Making Including Profiling,” ico.org.uk, 2024.</p></li>
<li><p>District Court of The Hague, SyRI ruling, ECLI:NL:RBDHA:2020:1878, 5 February 2020.</p></li>
<li><p>Lighthouse Reports, “The Algorithm Addiction,” lighthousereports.com, 2023.</p></li>
<li><p>MIT Technology Review, “We Read the Paper That Forced Timnit Gebru Out of Google. Here's What It Says,” technologyreview.com, December 2020.</p></li>
<li><p>Joy Buolamwini and Timnit Gebru, “Gender Shades: Intersectional Accuracy Disparities in Commercial Gender Classification,” Proceedings of Machine Learning Research, Conference on Fairness, Accountability, and Transparency, 2018.</p></li>
<li><p>Brookings Institution, “If Not AI Ethicists Like Timnit Gebru, Who Will Hold Big Tech Accountable?” brookings.edu, 2021.</p></li>
<li><p>Pew Research Center, “Growing Public Concern About the Role of Artificial Intelligence,” pewresearch.org, 2023.</p></li>
<li><p>Centers for Medicare and Medicaid Services (CMS), Guidance on AI Use in Medicare Advantage Coverage Determinations, February 2024.</p></li>
<li><p>Urban Institute, Analysis of Home Mortgage Disclosure Act Data, 2024.</p></li>
<li><p>Adair Morse and Robert Bartlett, UC Berkeley, “Consumer-Lending Discrimination in the FinTech Era,” Journal of Financial Economics, 2022.</p></li>
<li><p>Lehigh University, “AI Exhibits Racial Bias in Mortgage Underwriting Decisions,” news.lehigh.edu, 2024.</p></li>
<li><p>Stanford HAI, “How Flawed Data Aggravates Inequality in Credit,” hai.stanford.edu, 2021.</p></li>
<li><p>Consumer Financial Protection Bureau, Apple Card Enforcement Action against Apple and Goldman Sachs, and Comment to US Treasury Department on AI in Financial Services, 2024.</p></li>
<li><p>US Congress, Algorithmic Accountability Act of 2025, S.2164 and H.R.5511, 119th Congress, 2025.</p></li>
<li><p>Kentucky General Assembly, H.B. 366, Limiting Use of Risk Assessment Tool Scores in Criminal Justice, enacted 2024.</p></li>
<li><p>California Legislature, SB1120, Regulation of AI in Healthcare Claims Processing, enacted September 2024, effective January 2025.</p></li>
</ol>




<p><a href="https://tsecurity.de/weiterlesen/3592982/3621121/trust-is-not-a-feature/" target="_blank" rel="noopener noreferrer"><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%2Fos7pdncawa0mgqcin0gf.png" alt="Tim Green" width="100" height="100"></a></p>

<p><strong>Tim Green</strong><br>
<em>UK-based Systems Theorist &amp; Independent Technology Writer</em></p>

<p>Tim explores the intersections of artificial intelligence, decentralised cognition, and posthuman ethics. His work, published at <a href="https://tsecurity.de/weiterlesen/3592982/3621121/trust-is-not-a-feature/" target="_blank" rel="noopener noreferrer">smarterarticles.co.uk</a>, challenges dominant narratives of technological progress while proposing interdisciplinary frameworks for collective intelligence and digital stewardship.</p>

<p>His writing has been featured on Ground News and shared by independent researchers across both academic and technological communities.</p>

<p><strong>ORCID:</strong> <a href="https://tsecurity.de/weiterlesen/3592982/3621121/trust-is-not-a-feature/" target="_blank" rel="noopener noreferrer">0009-0002-0156-9795</a> <br>
<strong>Email:</strong> <a href="mailto:tim@smarterarticles.co.uk">tim@smarterarticles.co.uk</a></p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Array in Go]]></title>
<description><![CDATA[What is an Array in Go?


In Go, an array is a fixed-size, ordered set of values with the same type. Imagine an array as a 12 egg tray; the minimum number of eggs which can fit into an array is 12; the maximum number of eggs which can fit into an array is 12. That is the exact behaviour of a Go a...]]></description>
<link>https://tsecurity.de/de/3620844/sichere-programmierung/array-in-go/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3620844/sichere-programmierung/array-in-go/</guid>
<pubDate>Wed, 24 Jun 2026 11:42:08 +0200</pubDate>
<content:encoded><![CDATA[<h2>
  
  
  What is an Array in Go?
</h2>

<p>In Go, an array is a fixed-size, ordered set of values with the same type. Imagine an array as a 12 egg tray; the minimum number of eggs which can fit into an array is 12; the maximum number of eggs which can fit into an array is 12. That is the exact behaviour of a Go array.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main
​
import "fmt"
​
func main() {

var groceries [3]string// Step 1: Create an array that holds 3 strings
groceries[0] = "Bread"// Step 2: Put "Bread" in slot 0
groceries[1] = "Milk"// Step 3: Put "Milk" in slot 1
groceries[2] = "Eggs"// Step 4: Put "Eggs" in slot 2
fmt.Println(groceries)// Step 5: Print the whole array
}
</code></pre>

</div>



<p>Expected output:<br>
<code>[Bread Milk Eggs]</code></p>
<h2>
  
  
  Zero Values
</h2>

<p>In Go, you create an array by using the var keyword, and each of the slots receives the safe code Zero value, given that no elements are explicitly set.</p>

<p><a href="https://tsecurity.de/weiterlesen/3592705/3620844/array-in-go/" target="_blank" rel="noopener noreferrer"><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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft65yo36zfwm91e9b82t7.png" alt=" " width="504" height="253"></a></p>

<p>This means that your array will never be in an unsafe state of being uninitialized. It will be valid on every slot, even before set. The same thing is a safety feature in Go intentionally.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>var prices [3]float64

fmt.Println(prices) //  Output: [0 0 0]  - Go fills all the values with zeros automatically
</code></pre>

</div>



<h2>
  
  
  Declaring an Array
</h2>

<p>In Go, you can declare an array in a few different ways, and you will learn about each of them in turn.</p>

<h4>
  
  
  Using the var Declaration
</h4>



<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>var groceries [3]string
groceries[0] = "Bread"
groceries[1] = "Milk"
groceries[2] = "Eggs"
</code></pre>

</div>



<p>If you want to initialise an array of a specific size and use it later, then this is the best method to achieve this.</p>

<h4>
  
  
  Array Literals
</h4>

<p>If you are already aware of all the values at the time you write the code, then you can use the literal syntax:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main

import "fmt"

func main() {
groceries := [3]string{"Bread", "Milk", "Eggs"}
fmt.Println(groceries)
}
</code></pre>

</div>



<p>Expected output:<br>
<code>[Bread Milk Eggs]</code></p>

<p>The actual syntax is:<br>
<code>[size]type{value1, value2, value3}</code><br>
This method is used when we know the values which we want to store in an array.</p>
<h4>
  
  
  Let the Compiler count for you — The <code>...</code> trick
</h4>

<p>When using literal syntax, and you find that you have to manually count yourself, there's a shortcut in Go. Use ... to fill the size so the compiler can calculate the length automatically.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>groceries := [...]string{"Bread", "Milk", "Eggs", "Butter", "Coffee"} //Three dots  compiler counts for you
</code></pre>

</div>



<p>The type of groceries is [5]string. The ... instructs the compiler to count for you. This will be helpful if you have a super long list and you can't determine its length.</p>

<h4>
  
  
  Sparse Initialization
</h4>

<p>You can also use index: value syntax in the braces: to specify where a value will go:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main
​
import "fmt"
​
func main() {
// Put "Bread" in slot 0 and "Coffee" in slot 4; all other slots get ""
groceries := [5]string{0: "Bread", 4: "Coffee"}
fmt.Println(groceries)
}
</code></pre>

</div>



<p>​<br>
Expected output:<br>
<code>[Bread Coffee]</code></p>

<p>This is helpful when you have an array of a large number of elements, but just a couple of elements to change.</p>
<h2>
  
  
  How to access elements and modify an array.
</h2>

<p>Each element of an array is retrieved by the array name and an index number enclosed in square brackets.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main

import "fmt"

func main() {

groceries := [3]string{"Bread", "Milk", "Eggs"}

fmt.For each element, read it on the screen: 
Println(groceries[0])// Read "Bread" on the screen
fmt.Println(groceries[2])// Read slot 2: Eggs
groceries[0] = "Brown Bread" // Change the value of the 0th element of the array.
fmt.Println(groceries[0])// Read slot 0 again → "Brown Bread"
}
</code></pre>

</div>



<p>Expected output:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Bread
Eggs
Brown Bread
</code></pre>

</div>



<h4>
  
  
  What are the consequences of going beyond the lines?
</h4>

<p>If you try to access a non-existent part of a structure (for example, groceries[5] for a 3-element array), then Go will immediately exit the program with a runtime panic:<br>
runtime error: index out of range [5] with length 3<br>
Not a silent bug this time. Go lets you know what was amiss. len(array) - 1 is the final valid index in the array.</p>
<h2>
  
  
  Getting the Length with len()
</h2>

<p>len() returns the size (number of slots) of an array:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main

import "fmt"

func main() {
groceries := [5]string{"Bread", "Milk", "Eggs", "Butter", "Coffee"}
fmt.Println("Items on list:", len(groceries))
}
</code></pre>

</div>



<p>Expected output:<br>
<code>Items on list: 5</code></p>

<p>If an array is declared with a size, then len() always returns the exact size, irrespective of whether there are values stored in some of the array's slots. An array is always the size that it was created to be.</p>

<p>Also, there is an operation cap(), which is called "capacity". Arrays cannot be lengthened or shortened, but the two functions, cap() and len(), return the same value. Use len(arr) instead of literals for the size.  If you ever change the array declaration, len() adjusts automatically.</p>

<p>When the array is of length, len() always returns the size (independent of whether or not there are zeroes in the array). An array is always allocated the memory space it was declared to have.</p>
<h2>
  
  
  Arrays are valued, not references.
</h2>

<p>As a result of Go's copy behavior on assigning an array to a new variable, the entire array is copied. There are two independent variables – if one changes, the other one definitely will not change at all. Let's say we think of an example;<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main
​
import "fmt"
​
func main() {
groceries := [3]string{"Bread", "Milk", "Eggs"}
backup := groceries// This copies ALL of groceries into backup
​
groceries[0] = "Brown Bread"// Change the original
​
fmt.Println("groceries:", groceries)
fmt.Println("backup:", backup)
}
</code></pre>

</div>



<p>​<br>
Expected output:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>groceries: [Brown Bread Milk Eggs]
backup:[Bread Milk Eggs]

</code></pre>

</div>



<p>The above shows that despite replacing groceries [0] with ‘Brown Bread’, backup was not affected. This is similar to photocopying your shopping list! After they've made the photocopy, it remains unchanged if they write on the original. They started identical, but are now two completely separate pieces of paper.</p>

<h2>
  
  
  Sharing With Pointers
</h2>

<p>If we want, the changes that we make with our new variable to affect the original array, it's using a pointer.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main
​
import "fmt"
​
func main() {
groceries := [3]string{"Bread", "Milk", "Eggs"}
shared := &amp;groceries// &amp; means "give me the address of groceries"
​
groceries[0] = "Brown Bread"
​
fmt.Println("groceries:", groceries)
fmt.Println("shared:", *shared)// * means "follow the pointer to the value"
}
</code></pre>

</div>



<p>​<br>
Expected output:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>groceries: [Brown Bread Milk Eggs]
shared:[Brown Bread Milk Eggs]
</code></pre>

</div>



<p>&amp;groceries make a pointer. You don't copy the array; you copy a small "address" indicating where the array is stored in memory. That is followed by the word ‘*shared follows that address to get the actual value. When Shared access is needed, Pointers are used. In most situations, you'll opt for the default copy behaviour, which is more secure and easier to do.</p>

<h2>
  
  
  Comparing Arrays
</h2>

<p>Go and share how you can use “==” and “!=” to compare two arrays of equal “size” and “type”.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main
​
import "fmt"
​
func main() {
list1 := [3]string{"Bread", "Milk", "Eggs"}
list2 := [3]string{"Bread", "Milk", "Eggs"}
list3 := [3]string{"Bread", "Milk", "Coffee"}
​
fmt.Println("Same?", list1 == list2)// true
fmt.Println("Same?", list1 == list3)// false
}
</code></pre>

</div>



<p>​<br>
Expected output:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Same? true
Same? false

</code></pre>

</div>



<p>Two arrays are equal if they are of the same type and length and the elements of the arrays in the corresponding positions are all equal. You must have both conditions.<br>
Comparison of differently sized arrays is not possible. The compiler will halt you, since they are of different types.</p>

<p>Looping Through Arrays<br>
For small arrays, manually writing the below would work: <code>groceries[0], groceries[1], groceries[2]</code>. Anything larger, you just use a loop to visit each element by itself. Some of the loops you can use to accomplish this are listed here:</p>
<h4>
  
  
  The for range Loop
</h4>

<p>The most popular looping over an array in Go is the following for range loop:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main
import "fmt"
func main() {
groceries := [5]string{"Bread", "Milk", "Eggs", "Butter", "Coffee"}
For each element (index, item) in the groceries: {
fmt.println("Index: " + index + " Item: " + item)
}
}
</code></pre>

</div>



<p>Expected output:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Index: 0 Item: Bread
Index: 1 Item: Milk
Index: 2 Item: Eggs
Index: 3 Item: Butter
Index: 4 Item: Coffee
</code></pre>

</div>



<p>The index will contain the number of the slot that is being modified on each iteration through the loop, and the item will contain a copy of the element being modified. The loop stops by itself when it runs out of elements. No more worrying about out of bounds.</p>

<p>In Go programming, all the variables defined must be used. The for-range loop provides Go with two variables in its "for" clause: the index and element variable. If the index isn’t useful  to you, then you can't just leave it there intact. It will refuse to compile with Go.</p>

<p>This is where the blank identifier <code>_</code> is introduced. It is Go's way of letting you say, "I know this value exists, but I am deliberately throwing it away."<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main
​
import "fmt"
​
func main() {
groceries := [5]string{"Bread", "Milk", "Eggs", "Butter", "Coffee"}
​
for _, item := range groceries {
fmt.Println("Item:", item)
}
}
</code></pre>

</div>



<p>Expected output:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Item: Bread
Item: Milk
Item: Eggs
Item: Butter
Item: Coffee
</code></pre>

</div>



<p>It's also possible to discard the value and keep the index. If so, simply do not use the second variable at all:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>For each index in the groceries array {
fmt.Println("Index:", index)
}
</code></pre>

</div>



<h4>
  
  
  A classic  for Loop.
</h4>

<p>In the case where you require more control, such as when going in reverse or skipping an element, the classic counter-based for loop is best:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main
​
import "fmt"
​
func main() {
groceries := [5]string{"Bread", "Milk", "Eggs", "Butter", "Coffee"}
​
for i := 0; i &lt; len(groceries); i++ {
fmt.Println("Position", i, "-&gt;", groceries[i])
}
}
</code></pre>

</div>



<p>​<br>
Expected output:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Position 0 -&gt; Bread
Position 1 -&gt; Milk
Position 2 -&gt; Eggs
Position 3 -&gt; Butter
Position 4 -&gt; Coffee
</code></pre>

</div>



<p>​<br>
Iterating in reverse:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>for i := len(groceries) - 1; i &gt;= 0; i-- {
fmt.Println(groceries[i])
}

//`Output: Coffee → Butter → Eggs → Milk → Bread`
</code></pre>

</div>



<p>Printing every other item:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>for i := 0; i &lt; len(groceries); i += 2 {
fmt.Println(groceries[i])
}

//`Output: Bread → Eggs → Coffee (slots 0, 2, and 4)`
</code></pre>

</div>



<h2>
  
  
  Multi-Dimensional Arrays
</h2>

<p>So far, all the arrays have been a single row of values (one-dimensional). Multi-dimensional arrays (arrays of arrays) are also supported in Go.<br>
The most common case is a 2D array, which is a grid or a table. For instance, if I go to the shops every week and make a plan for the items I want to buy by each day and area of the shop:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main
​
import "fmt"
​
func main() {
// A 3-day plan with 2 items per day
weeklyPlan := [3][2]string{
{"Bread", "Milk"},// Day 0
{"Eggs", "Butter"},// Day 1
{"Coffee", "Fruit"},// Day 2
}
​
for day, items := range weeklyPlan {
fmt.Printf("Day %d: %s and %s\n", day, items[0], items[1])
}
}

Day 0: Bread and Milk
Day 1: Eggs and Butter
Day 2: Coffee and Fruit
</code></pre>

</div>



<p><code>[3][2]string</code>: An array of 3 elements, each of which is an array of 2 strings. The first index tells you which row to choose, the second index tells you which column to choose:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>weeklyPlan[0][0] = "Bread"// Day 0, first item
weeklyPlan[0][1] = "Milk"// Day 0, second item
weeklyPlan[2][1] = "Fruit"// Day 2, second item
</code></pre>

</div>



<p>An index position is needed to reference a particular cell, the first being the row index, and the second, the column index.<br>
passing an Array object to a function.<br>
In Go, an array passed to a function is itself a complete copy of the array; the function does not refer to the original array. Any changes the function makes don't affect the original:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main
​
import "fmt"
​
func printAndModify(list [3]string) {
list[0] = "Changed"// Modifies the LOCAL copy only
fmt.Println("Inside:", list)
}
​
func main() {
groceries := [3]string{"Bread", "Milk", "Eggs"}
printAndModify(groceries)
fmt.Println("Outside:", groceries)// Original is unchanged
}
</code></pre>

</div>



<p>​<br>
Expected output:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Inside: [Changed Milk Eggs]
Outside: [Bread Milk Eggs]
</code></pre>

</div>



<p>The function takes a snapshot of an array that is independent of one another.<br>
If you have to change the original function, provide a pointer:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>package main
​
import "fmt"
​
func updateFirstItem(list *[3]string) {
list[0] = "Brown Bread"// This modifies the original
}
​
func main() {
groceries := [3]string{"Bread", "Milk", "Eggs"}
updateFirstItem(&amp;groceries)
fmt.Println("Outside:", groceries)// Now the original IS changed
}
</code></pre>

</div>



<p>​<br>
Expected output:<br>
<code>Outside: [Brown Bread Milk Eggs]</code></p>

<p>If you have a large array greater than a few hundred elements, always use a pointer instead of copying to avoid the cost of the copy.</p>
<h2>
  
  
  Limitations of Arrays
</h2>

<p>Though concise and straightforward, arrays are restricted in their use and come with limitations that you'll hit hard soon.</p>
<h4>
  
  
  The Size Is Fixed Forever
</h4>

<p>After defining a [3]string, it will always contain exactly 3 strings, always! You can't add a fourth item. You can't remove one to shrink it. The size is baked in at compile time. If your shopping list grows to 6 items, your [5]string array can't help you.<br>
The array size can not be a variable, must be a literal number or named constant:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>n := 5
var groceries [n]string
</code></pre>

</div>



<p>The above is a compiler error because of the occurrence of the variable n.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>Fix:
const n = 5
var groceries [n]string// it Works, n is a constant
</code></pre>

</div>



<p>This means you can't create an array whose size depends on something you only know at runtime, like how many items the user typed in. For that, you need a slice.</p>

<h4>
  
  
  Passing Large Arrays Is Expensive
</h4>

<p>Every function call copies the entire array. For a [10000]string, that is 10,000 strings copied just to call a function.<br>
Arrays of Different Sizes Are Incompatible Types<br>
A function that accepts [3] strings can't be called with a [5]string. You would need two separate functions with different signatures.<br>
<code>append()</code> Does Not Work on Arrays<br>
<code>append()</code> — the function that adds elements to a collection — only works on slices, not arrays:<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>groceries := [3]string{"Bread", "Milk", "Eggs"}
groceries = append(groceries, "Butter")// Compiler `error`: append expects a slice
</code></pre>

</div>



<p>​<br>
These limitations are not bugs. Fixed-size value types are simple, predictable, and give the compiler strong guarantees. But most real-world programming needs something that can grow and shrink at runtime. That something is the slice.</p>
<h2>
  
  
  Common Mistakes with Arrays
</h2>
<h4>
  
  
  Mistake 1: Assigning Arrays of Different Sizes
</h4>


<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>list := [3]string{"Bread", "Milk", "Eggs"}
var biggerList [4]string = list//  Compiler `error` — different types
</code></pre>

</div>


<p>​<br>
Fix: make sure both arrays have the same size, or use a slice if you need flexibility.<br>
​</p>
<h4>
  
  
  Mistake 2: Expecting Assignment to Share Data
</h4>


<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>list := [3]string{"Bread", "Milk", "Eggs"}
backup := list
backup[0] = "Brown Bread"
fmt.Println(list[0])// Prints "Bread", NOT "Brown Bread" — list was not changed
</code></pre>

</div>


<p>Arrays are value types. Assignment copies everything. If you want shared access, use &amp;list to get a pointer, or switch to slices.</p>

<p>Mistake 3: Off-by-One on the Last Element<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>groceries := [3]string{"Bread", "Milk", "Eggs"}
fmt.Println(groceries[3])//  Runtime `panic`: index out of range
</code></pre>

</div>



<p>For an array of length 3, the valid indexes are 0, 1, and 2. The last valid index is always len(array) - 1.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Every API Will Be Rebuilt for Agents]]></title>
<description><![CDATA[MCP solves the plug. It doesn't solve the verb gap.

Hand a coding agent a beautifully documented REST API — versioned, OpenAPI'd, the kind a human developer would happily build against — wrap it in MCP in an afternoon, and watch it still fumble. It picks the wrong endpoint. It calls three when o...]]></description>
<link>https://tsecurity.de/de/3618080/sichere-programmierung/every-api-will-be-rebuilt-for-agents/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3618080/sichere-programmierung/every-api-will-be-rebuilt-for-agents/</guid>
<pubDate>Tue, 23 Jun 2026 13:26:45 +0200</pubDate>
<content:encoded><![CDATA[<p>MCP solves the plug. It doesn't solve the verb gap.</p>

<p>Hand a coding agent a beautifully documented REST API — versioned, OpenAPI'd, the kind a human developer would happily build against — wrap it in MCP in an afternoon, and watch it still fumble. It picks the wrong endpoint. It calls three when one would do. It does a destructive write it should have asked about. The API isn't bad. It's built for the wrong consumer.</p>

<p>MCP is winning the part that was always going to be solved — <em>the plug</em>. And winning is what exposes the uncomfortable part: almost every API we have is built for a consumer that's no longer the only primary consumer. For twenty years that consumer was a human developer who showed up with intent and a mental model. Now it's an agent that has neither and has to reconstruct both from your surface. When the primary consumer of an interface changes that completely, the interface gets rebuilt. It always has.</p>

<p>So, here's the claim I'll commit to: <strong>the serious product surfaces agents operate against will be rebuilt around agent-native operations.</strong> Not wrapped. Rebuilt. These are still one person's notes, not advice — and intentionally directional, not a migration plan. The direction isn't what I'm unsure about. Only the timeline is.</p>

<p>When I say <em>every API</em>, I don't mean every endpoint gets replaced or every protocol disappears. I mean the product-level operations an agent is trusted to execute move from resource-shaped APIs to intent-shaped contracts — redesigned around goals, state, side-effects, approval, and recovery.</p>

<h2>
  
  
  MCP standardizes the plug, not the operations
</h2>

<p>Give MCP its due: it's now a genuine <a href="https://tsecurity.de/weiterlesen/3589941/3618080/every-api-will-be-rebuilt-for-agents/" target="_blank" rel="noopener noreferrer">cross-client standard</a> — Claude, ChatGPT, VS Code, Cursor, Codex, Copilot. Connection, auth, transport, human-in-the-loop, long-running Tasks: all getting standardized, steadily.</p>

<p>But in the spec, a tool is just a function — a name, a description, a schema. MCP deliberately doesn't decide what state transitions your domain has, what order tools go in, which operations are dangerous, or which need approval. That's the right scope for a protocol. It also means MCP gives you a clean way to expose <em>whatever your API already is</em> — and what it already is, is a thing designed for a developer who brings the plan.</p>

<p>Call the failure <strong>the verb gap</strong>: APIs hand agents nouns and CRUD; agents need verbs that carry intent. No protocol closes that gap, because the gap is in the API, not the wire. MCP solves the plug. It does not solve the verb gap.</p>

<h2>
  
  
  The wrapper ceiling is already visible
</h2>

<p>The tell is that the most API-mature companies are walking the wrapper back, in public.</p>

<p>GitHub's <a href="https://tsecurity.de/weiterlesen/3589941/3618080/every-api-will-be-rebuilt-for-agents/" target="_blank" rel="noopener noreferrer">official MCP server</a> is excellent — and GitHub is <a href="https://tsecurity.de/weiterlesen/3589941/3618080/every-api-will-be-rebuilt-for-agents/" target="_blank" rel="noopener noreferrer">narrowing its default toolset</a> and consolidating PR tools into fewer, more capable ones, explicitly to cut tool bloat and improve agent reasoning. The implication is hard to miss: even one of the best API companies on the planet is learning that a 1:1 mapping from product API to agent tools isn't the right shape.</p>

<p>Research points the same way. <a href="https://tsecurity.de/weiterlesen/3589941/3618080/every-api-will-be-rebuilt-for-agents/" target="_blank" rel="noopener noreferrer">AutoMCP</a> generated MCP servers from OpenAPI specs: across 50 real APIs and ~5,000 endpoints, tool-call success went from 76.5% to 99.9% — but only after fixing the underlying spec. A <a href="https://tsecurity.de/weiterlesen/3589941/3618080/every-api-will-be-rebuilt-for-agents/" target="_blank" rel="noopener noreferrer">2026 study</a> on agent-ready OpenAPI docs found agents failing systematically at planning and tool selection, with defects in essentially every operation. Their line is the one to underline: an API can be structurally valid and still not be semantically ready for an agent.</p>

<p>Every "just wrap it" path ends at the same wall — the contract is wrong for the new consumer, and you can't wrapper your way to a different contract. Wrapping buys a demo. Rebuilding buys a product.</p>

<h2>
  
  
  What "rebuilt for agents" looks like
</h2>

<p>An agent-native API isn't an API an agent <em>can</em> call. It's an API whose operations carry enough intent, state, and safety for an agent to know what it's doing.</p>

<p>Not a few coarse endpoints bolted on. A different default shape for every operation — one that answers more than "what do I return." It answers: what's the goal, what state am I in, what are the side-effects, do I need approval, how do I recover.<br>
</p>

<div class="highlight js-code-highlight">
<pre class="highlight plaintext"><code>inspect_pull_request        → state + what's relevant, not the raw blob
find_merge_blockers         → the global fact, computed, not re-derived
preview_write_action        → dry-run: here's what WOULD happen
commit_approved_action      → the write, gated behind explicit approval
explain_missing_permissions → why it can't, in actionable terms
rollback_last_action        → recovery as a first-class verb
</code></pre>

</div>



<p>Agent-native doesn't just mean coarse-grained. A coarse endpoint can still be unsafe, opaque, and impossible to undo. The difference is that an agent-native operation exposes its preconditions, expected effects, uncertainty, required approvals, and recovery path <em>as part of the contract</em>. <code>preview</code> / <code>commit</code> split intent from effect, so a dangerous write becomes a two-step you can reason about. <code>rollback</code> makes recovery part of the surface, not an afterthought.</p>

<p>There's a hint here about <em>how</em> these get built. Today we usually grow REST outward from the database — tables become resources, columns become fields, CRUD becomes the default. But an operation that knows its preconditions and its legal next moves is really a state machine wearing an API. It's not a stretch to imagine the mainstream flipping: generating the surface from an explicit state model — transitions, guards, and valid next-actions as the source of truth — with storage downstream, instead of the other way around. That's the version of this I'd most want to build.</p>

<p>And here's why it's one API, not two: developers want all of this too. Preview-before-commit, blast radius, clear permission errors, rollback — that's not an "agent edition," it's just a <em>better</em> API whose main consumer happens to be an agent. You don't want to maintain a human API plus an agent API forever. Over time, the agent-native design should subsume the human one.</p>

<p>This connects to <a href="https://tsecurity.de/weiterlesen/3589941/3618080/every-api-will-be-rebuilt-for-agents/" target="_blank" rel="noopener noreferrer">the last post</a>: a good operation collapses a risky multi-step workflow into one confident verb, the way a rigorous fact collapses a hedge into a flat statement. Rigor compresses; so does a good operation.</p>

<h2>
  
  
  It's not just APIs — CLIs are the same surface
</h2>

<p>This was never really about REST. It's about any surface an agent operates against, and the CLI is the other big one. A coding agent lives in a terminal — it runs <code>git</code>, <code>kubectl</code>, your build and deploy scripts — and hits the same verb gap: tools that assume a human who already knows the flags.</p>

<p>CLIs add a second problem the API case hides: output. Most CLIs print for a human — colors, progress bars, free-form logs, a summary line you're meant to eyeball. The agent has to scrape that, which is the verb gap again, moved to the return path. So an agent-native CLI prioritizes machine-readable output — <code>--json</code>, structured logs, stable exit codes, errors that name the next action — over pretty terminal formatting. When you can't have both, the default flips: readable for the agent beats readable for the eye.</p>

<p>That's the same coin as the verb gap, both sides of it. Calling side: verbs that carry intent. Return side: state the agent can parse, not prose it has to interpret. And the shift is bigger than APIs: every interface we built assuming a human on the other end — APIs, CLIs, logs, output formats — is up for reconsideration once the other end is an agent.</p>

<h2>
  
  
  Security is what makes it "must," not "nice"
</h2>

<p>MCP clients put tool name, description, and schema straight into the model's context — so a malicious description can steer the model (tool poisoning, confused-deputy, over-broad scopes). And agents use configured tools <em>autonomously</em>; GitHub's own docs recommend allowlisting read-only tools for exactly this reason.</p>

<p>You can't allowlist your way to safe writes on a human-shaped API. You rebuild writes as preview → approve → commit, with permission errors that explain themselves. Safety isn't a wrapper you add; it's a property you design into the operations.</p>

<h2>
  
  
  Three layers now, one contract later
</h2>

<p>This won't happen overnight. Near term, three things coexist — but only one is the endgame.</p>

<div class="table-wrapper-paragraph"><table>
<thead>
<tr>
<th>Layer</th>
<th>What it is</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Direct API / SDK / CLI</strong></td>
<td>local detour — files, shell, git, tests</td>
<td>persists where proximity beats protocol</td>
</tr>
<tr>
<td><strong>Wrapper MCP over legacy API</strong></td>
<td>the human-shaped API, exposed as tools</td>
<td>a bridge — scaffolding, not a destination</td>
</tr>
<tr>
<td><strong>Agent-native API</strong></td>
<td>goal-shaped operations with state, approval, recovery</td>
<td>where everything converges</td>
</tr>
</tbody>
</table></div>

<p>The wrapper is useful <em>as a transition</em> — it connects what exists today — but it carries the legacy contract underneath, and that contract is the problem. Over time the core gets rebuilt and the wrapper dissolves, the same way mobile BFFs gave way to redesigned APIs instead of living forever as shims.</p>

<p>Practically: greenfield should start agent-native <em>now</em> — no reason to ship a human-only contract you'll rewrite. Brownfield wraps as a bridge, then rebuilds the operations that matter most first. Either way the arrow points one direction.</p>

<h2>
  
  
  Objections I'd raise myself
</h2>

<ul>
<li>
<strong>"You can't rewrite every API; legacy is forever."</strong> Legacy persists — but "persists" isn't "is what you'd build." SOAP still runs; nobody starts there. Human-shaped APIs become the thing you wrap and migrate off, not the thing you design.</li>
<li>
<strong>"This is just BFFs rebranded."</strong> The technique isn't new; the consumer is. A BFF serves a fixed UI flow a human designed. An agent-native operation has to surface its own preconditions, danger, and recovery, because the agent is <em>forming</em> the plan — and it applies to the whole surface, not one frontend.</li>
<li>
<strong>"Models will get good enough to use raw APIs."</strong> Maybe for reads. But capability makes the security case <em>worse</em> — a more capable agent doing an unguarded destructive write is the nightmare, not the fix.</li>
<li>
<strong>"Rebuilding every domain doesn't scale."</strong> The load-bearing worry. The bet is that AI dropped the cost of domain-specific implementation enough that it finally pencils out. If that's wrong, the timeline stretches. The direction doesn't change.</li>
</ul>

<h2>
  
  
  Where this is going
</h2>

<p>The contract at the center of interface design is flipping. Old: <em>the human holds the intent; the API returns materials.</em> New: <em>the agent holds the goal; the API returns state, constraints, the next safe action, and a way back.</em> The competitive axis stops being endpoint count and becomes whether an agent can safely accomplish a goal against your surface.</p>

<p>We probably don't have the right format for this yet. I doubt it's REST or GraphQL; both were shaped for consumers that aren't the agent. For now, OpenAPI and Zod are still the right place to stand: precise schemas reduce mistakes, and AutoMCP's jump from 76.5% to 99.9% is evidence of that. But implementer correctness and agent operability are different axes, and the second one will likely grow its own format. That part I'm looking forward to.</p>

<p>These days I keep tacking defensive lines onto prompts: "preview before you write," "ask before anything destructive," "explain why you can't." It's not that I distrust the agent — it's that the operations I hand it are the vague part, so reminders are the only patch I have. Rebuild the operations to carry their own preview, approval, and rollback, and those lines stop being necessary.</p>

<p>If the operation is safe by design, you don't have to ask the agent to be careful with it.</p>]]></content:encoded>
</item>
<item>
<title><![CDATA[Hackers steal Apple and Tesla data from Tata's iPhone factory]]></title>
<description><![CDATA[One of Tata's iPhone plants in India has been the victim of a cyberattack said to have taken over 630GB of confidential data concerning both Apple and Tesla.One of Tata's two iPhone plants in India. It's not been reported which plant suffered the cyberattack - image Credit: TataIt's not clear fro...]]></description>
<link>https://tsecurity.de/de/3618076/apple-ios-macos/hackers-steal-apple-and-tesla-data-from-tatas-iphone-factory/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3618076/apple-ios-macos/hackers-steal-apple-and-tesla-data-from-tatas-iphone-factory/</guid>
<pubDate>Tue, 23 Jun 2026 13:24:49 +0200</pubDate>
<content:encoded><![CDATA[One of Tata's <a href="https://tsecurity.de/weiterlesen/3589937/3618076/hackers-steal-apple-and-tesla-data-from-tatas-iphone-factory/" target="_blank" rel="noopener noreferrer">iPhone</a> plants in India has been the victim of a cyberattack said to have taken over 630GB of confidential data concerning both Apple and Tesla.<br><br><div><img src="https://photos5.appleinsider.com/gallery/67972-143296-DJI_0063-xl.jpg" alt="Aerial view of a large industrial complex with expansive rooftop solar panels, surrounded by dry brown landscape, access roads, parked vehicles, and distant hills under a hazy sky" height="747"><br><span>One of Tata's two iPhone plants in India. It's not been reported which plant suffered the cyberattack - image Credit: Tata</span></div><br>It's not clear from reporting so far whether the Tata plant in India is the same one in Hosur, Tamil Nadu that has recently come under fire for allegedly <a href="https://tsecurity.de/weiterlesen/3589937/3618076/hackers-steal-apple-and-tesla-data-from-tatas-iphone-factory/" target="_blank" rel="noopener noreferrer">contaminating local water</a>. What is known, according to <em>Reuters</em>, is that the <a href="https://tsecurity.de/weiterlesen/3589937/3618076/hackers-steal-apple-and-tesla-data-from-tatas-iphone-factory/" target="_blank" rel="noopener noreferrer">stolen data</a> includes 33 files and folders relating to Hosur.<br><br>"A few weeks ago, Tata Electronics identified a cybersecurity incident on some of our systems," said a Tata Electronics spokesperson. "Our response protocols were deployed immediately, and the incident has had no impact on our operations across businesses, which remain unaffected."<br><br><br> <a href="https://tsecurity.de/weiterlesen/3589937/3618076/hackers-steal-apple-and-tesla-data-from-tatas-iphone-factory/" target="_blank" rel="noopener noreferrer">Continue Reading on AppleInsider</a> | <a href="https://tsecurity.de/weiterlesen/3589937/3618076/hackers-steal-apple-and-tesla-data-from-tatas-iphone-factory/" target="_blank" rel="noopener noreferrer">Discuss on our Forums</a>]]></content:encoded>
</item>
<item>
<title><![CDATA[Texas lassoes massive Microsoft datacenter - and 20 years of gas turbine emissions]]></title>
<description><![CDATA[The air turns brown when bit barns come to town … deep in the heart of Texas]]></description>
<link>https://tsecurity.de/de/3616679/it-nachrichten/texas-lassoes-massive-microsoft-datacenter-and-20-years-of-gas-turbine-emissions/</link>
<guid isPermaLink="true">https://tsecurity.de/de/3616679/it-nachrichten/texas-lassoes-massive-microsoft-datacenter-and-20-years-of-gas-turbine-emissions/</guid>
<pubDate>Mon, 22 Jun 2026 23:18:08 +0200</pubDate>
<content:encoded><![CDATA[The air turns brown when bit barns come to town … deep in the heart of Texas]]></content:encoded>
</item>
</channel>
</rss>
<!-- Generated in 4,25ms -->