<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: SIKOUTRIS</title>
    <description>The latest articles on DEV Community by SIKOUTRIS (@julien786534).</description>
    <link>https://dev.to/julien786534</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3783172%2Fd957c4d9-9565-46f3-8256-313231657389.png</url>
      <title>DEV Community: SIKOUTRIS</title>
      <link>https://dev.to/julien786534</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/julien786534"/>
    <language>en</language>
    <item>
      <title>Sora Hit #1 on the App Store, Then Died in Six Months: What That Does to a Comparison Site</title>
      <dc:creator>SIKOUTRIS</dc:creator>
      <pubDate>Sat, 24 Oct 2026 14:09:49 +0000</pubDate>
      <link>https://dev.to/julien786534/sora-hit-1-on-the-app-store-then-died-in-six-months-what-that-does-to-a-comparison-site-4a37</link>
      <guid>https://dev.to/julien786534/sora-hit-1-on-the-app-store-then-died-in-six-months-what-that-does-to-a-comparison-site-4a37</guid>
      <description>&lt;p&gt;Last month, our AI video tools comparison site published a guide titled "Sora vs Runway vs Pika 2026." By the time the FAQ section was finished, one of the three tools in the title had already stopped existing.&lt;/p&gt;

&lt;p&gt;I maintain &lt;a href="https://aivideocompare.com" rel="noopener noreferrer"&gt;aivideocompare.com&lt;/a&gt;, an independent comparison site covering 25+ AI video tools across generation, editing, avatars, subtitles and short-form content. No affiliate rankings, no pay-to-play placement -- just pricing and feature tables we try to keep honest. That "try" is the hard part right now, and Sora is the clearest example of why.&lt;/p&gt;

&lt;h2&gt;
  
  
  A product that died faster than our review cycle
&lt;/h2&gt;

&lt;p&gt;OpenAI launched Sora as a standalone app, and it briefly hit #1 on the US App Store. Then the numbers turned: month-over-month declines in installs and spend starting at the beginning of 2026, including a reported 32% drop in new downloads between November and December. OpenAI announced the shutdown on March 24, 2026. The web app and mobile app were discontinued on April 26, 2026. The API followed on September 24, 2026. A reported $1B partnership with Disney went with it.&lt;/p&gt;

&lt;p&gt;Six months from launch to teardown is not a normal product lifecycle. For a comparison site, it means a page we wrote in good faith -- citing real pricing, real output quality, real use cases -- described a tool that, within the same calendar year, stopped being something you could sign up for.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's not just Sora
&lt;/h2&gt;

&lt;p&gt;Google's video line moved almost as fast, just less dramatically. The &lt;code&gt;veo-3.0-generate-001&lt;/code&gt; and &lt;code&gt;veo-3.0-fast-generate-001&lt;/code&gt; endpoints were deprecated on June 30, 2026 in favor of &lt;code&gt;veo-3.1-generate-001&lt;/code&gt; / &lt;code&gt;veo-3.1-fast-generate-001&lt;/code&gt;. Then, by October, the Veo 3.1 preview models on the Gemini API themselves showed up with shutdown notices, with traffic being pointed toward &lt;code&gt;gemini-omni-1.1-flash&lt;/code&gt; instead. That's three named "state of the art" generations in about seven months, on the model line that's supposed to be the stable alternative to Sora.&lt;/p&gt;

&lt;p&gt;When the tools you're comparing turn over that fast, "best AI video generator 2026" isn't a one-time piece of content. It's closer to a changelog you maintain for as long as the page stays up.&lt;/p&gt;

&lt;h2&gt;
  
  
  The quieter problem: you can't always read the price
&lt;/h2&gt;

&lt;p&gt;Model churn is the visible failure mode. The one that actually eats more of our time is pricing verification, because several vendors make it adversarial by accident or by design. Auditing the pricing tables for our comparison guide, we hit three distinct failure patterns in tools that are very much still alive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CapCut&lt;/strong&gt;: the official pricing page returns a 404 when fetched directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VEED.IO&lt;/strong&gt;: pricing tiers render client-side -- there are no figures in the HTML actually served to a basic request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fliki&lt;/strong&gt;: the free plan is confirmed and stable, but paid tiers load dynamically, so a static fetch gives you half the picture.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are "the product changed underneath us" problems. They're "you cannot even read the current price without running a full browser" problems. For a site that promises no pay-to-play rankings, that's not a cosmetic issue -- publishing a stale or wrong price is the exact failure mode we're trying to avoid by not taking money for placement.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this changes about how we build the page
&lt;/h2&gt;

&lt;p&gt;Two things, concretely. First, any comparison title that names specific products needs a recheck cadence baked in, not a "write once" assumption -- a tool named in a 2026 headline can be gone by the time the headline is still ranking. Second, pricing data that only renders client-side can't be treated the same as a static price list; it needs either a documented "last verified by hand on [date]" note or a different data source, because silently serving a 404-derived blank isn't better than not listing the tool at all.&lt;/p&gt;

&lt;p&gt;None of this is a reason to stop doing honest comparisons -- if anything it's the opposite. A site that still says "Sora vs Runway vs Pika" without acknowledging Sora is gone is worse than useless; it actively misleads whoever's trying to pick a tool today. We keep &lt;a href="https://aivideocompare.com/guide/sora-vs-runway-vs-pika-2026/" rel="noopener noreferrer"&gt;the guide&lt;/a&gt; up, but the real product isn't the comparison table -- it's the discipline of going back and fixing it when the ground moves, which in this category is most months.&lt;/p&gt;

&lt;p&gt;If you maintain a comparison or review site in a category with this much product churn, I'd be curious how you're handling re-verification. We're still mostly doing it by hand.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>saas</category>
    </item>
    <item>
      <title>Why a black box doesn't redact a PDF (and how to remove the text for real with MuPDF WebAssembly)</title>
      <dc:creator>SIKOUTRIS</dc:creator>
      <pubDate>Fri, 23 Oct 2026 16:17:12 +0000</pubDate>
      <link>https://dev.to/julien786534/why-a-black-box-doesnt-redact-a-pdf-and-how-to-remove-the-text-for-real-with-mupdf-webassembly-2fma</link>
      <guid>https://dev.to/julien786534/why-a-black-box-doesnt-redact-a-pdf-and-how-to-remove-the-text-for-real-with-mupdf-webassembly-2fma</guid>
      <description>&lt;p&gt;A black rectangle over a line of text in a PDF hides nothing. It sits in a layer on top of the page, and the text underneath is still there: you can select it, copy it, search for it, or extract it with a single command. In January 2019, a court filing by Paul Manafort's lawyers was "redacted" this way, and journalists read the hidden passages by copying and pasting them.&lt;/p&gt;

&lt;p&gt;I ran into this while building a browser-based redaction tool, so here is what actually happens inside the file, and how to remove text for real with MuPDF compiled to WebAssembly, without uploading the document anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the black box fails
&lt;/h2&gt;

&lt;p&gt;A PDF page is a content stream: a list of drawing operators. Text is drawn by operators like &lt;code&gt;Tj&lt;/code&gt;, with the glyphs and their positions. When you draw a black rectangle "over" it, most editors do one of two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;add a &lt;code&gt;Square&lt;/code&gt; annotation, which lives in the page's &lt;code&gt;/Annots&lt;/code&gt; array, separate from the content stream;&lt;/li&gt;
&lt;li&gt;or append a filled rectangle (&lt;code&gt;re f&lt;/code&gt;) at the end of the content stream.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In both cases the original &lt;code&gt;Tj&lt;/code&gt; operator is untouched. Any text extractor reads the operators, not the pixels, so it ignores the box entirely.&lt;/p&gt;

&lt;p&gt;You can check it in a few lines with the &lt;code&gt;mupdf&lt;/code&gt; npm package (same engine as the browser build):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;mupdf&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mupdf&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;mupdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;openDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/pdf&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toStructuredText&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;asText&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On a test file where I covered an IBAN with a black square annotation, this printed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client IBAN: FR76 3000 6000 0112 3456 7890 189
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The box was there on screen. The number was there in the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real redaction: rewrite the content stream
&lt;/h2&gt;

&lt;p&gt;Real redaction means removing the glyphs from the content stream itself, and dealing with anything else that overlaps the area (images, vector drawings). MuPDF does this with &lt;code&gt;Redact&lt;/code&gt; annotations followed by &lt;code&gt;applyRedactions()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;needle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FR76 3000 6000 0112 3456 7890 189&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;hit&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;needle&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;hit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// a quad is 8 numbers: ul, ur, ll, lr corners&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
      &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nx"&gt;q&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createAnnotation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Redact&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;setRect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;applyRedactions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                                    &lt;span class="c1"&gt;// draw a black box where text was&lt;/span&gt;
  &lt;span class="nx"&gt;mupdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PDFPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REDACT_IMAGE_PIXELS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// blank the covered pixels of images&lt;/span&gt;
  &lt;span class="nx"&gt;mupdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PDFPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REDACT_LINE_ART_NONE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;// keep vector drawings&lt;/span&gt;
  &lt;span class="nx"&gt;mupdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PDFPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;REDACT_TEXT_REMOVE&lt;/span&gt;         &lt;span class="c1"&gt;// delete the glyphs&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After saving and reopening, the same extraction gives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client IBAN:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and &lt;code&gt;page.search("FR76")&lt;/code&gt; returns nothing. I also saved the file decompressed and searched the raw bytes: the string is gone.&lt;/p&gt;

&lt;p&gt;Three details matter here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Save with garbage collection.&lt;/strong&gt; PDFs can be saved incrementally: changes are appended and the old objects stay in the file. If you save without cleaning, the previous version of the content stream may still be in there. Use options like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;saveToBuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;garbage=4,compress,clean&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;asUint8Array&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;garbage=4&lt;/code&gt; drops unreferenced objects and merges duplicates, &lt;code&gt;clean&lt;/code&gt; rewrites the content streams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Copy the buffer.&lt;/strong&gt; &lt;code&gt;asUint8Array()&lt;/code&gt; returns a view on the WebAssembly heap. If the heap grows (open a second document, render a page), the view can become invalid and you get an empty or corrupted download. The &lt;code&gt;.slice()&lt;/code&gt; makes a real copy. This one cost me a confusing bug where large files sometimes downloaded as zero bytes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Images are not text.&lt;/strong&gt; If the sensitive data is in a scanned image, &lt;code&gt;REDACT_TEXT_REMOVE&lt;/code&gt; does nothing for it. &lt;code&gt;REDACT_IMAGE_PIXELS&lt;/code&gt; blanks the pixels under the rectangle, which is what you want for a scan. There is no text to find in a scan without OCR, so the user has to draw the zone by hand.&lt;/p&gt;

&lt;h2&gt;
  
  
  The rest of the leak surface
&lt;/h2&gt;

&lt;p&gt;Even with the text gone, a PDF often carries more than its pages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the &lt;code&gt;/Info&lt;/code&gt; dictionary and the XMP &lt;code&gt;/Metadata&lt;/code&gt; stream (author, software, sometimes the original file path);&lt;/li&gt;
&lt;li&gt;form fields whose values live in &lt;code&gt;/AcroForm&lt;/code&gt;, not in the page content. Search will not find a value typed in a field unless you flatten the form first, which is how I once missed an IBAN in a test;&lt;/li&gt;
&lt;li&gt;annotations and comments, embedded files, JavaScript.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Deleting &lt;code&gt;/Metadata&lt;/code&gt; from the catalog, emptying &lt;code&gt;/Info&lt;/code&gt;, then saving with &lt;code&gt;garbage=4&lt;/code&gt; removes the old metadata objects as well.&lt;/p&gt;

&lt;h2&gt;
  
  
  Doing it in the browser
&lt;/h2&gt;

&lt;p&gt;The whole thing runs client side: the &lt;code&gt;.wasm&lt;/code&gt; file (about 10 MB, cached after the first visit) loads once, the PDF is read from a file input as an &lt;code&gt;ArrayBuffer&lt;/code&gt;, processed in memory, and downloaded with a &lt;code&gt;Blob&lt;/code&gt; URL. Nothing leaves the machine, which is the point when the document is a contract or a medical record. A strict Content Security Policy works as long as you allow &lt;code&gt;'wasm-unsafe-eval'&lt;/code&gt; in &lt;code&gt;script-src&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One licensing note: MuPDF is AGPL. If you ship it on a public website, you publish your source code, or you buy a commercial licence from Artifex.&lt;/p&gt;

&lt;p&gt;I put all of this into a free tool, &lt;a href="https://pdfanonym.com/redact-pdf/" rel="noopener noreferrer"&gt;pdfanonym.com&lt;/a&gt;, which runs entirely in the browser. But even if you never use it, try the extraction check above on the last "redacted" PDF you received. The results can be surprising.&lt;/p&gt;

</description>
      <category>pdf</category>
      <category>webassembly</category>
      <category>privacy</category>
      <category>javascript</category>
    </item>
    <item>
      <title>An AI Writing Tool I Reviewed Got Acquired, Renamed, and Quietly Disappeared — So I Audited Pricing On All 55</title>
      <dc:creator>SIKOUTRIS</dc:creator>
      <pubDate>Thu, 22 Oct 2026 12:17:03 +0000</pubDate>
      <link>https://dev.to/julien786534/an-ai-writing-tool-i-reviewed-got-acquired-renamed-and-quietly-disappeared-so-i-audited-pricing-3hih</link>
      <guid>https://dev.to/julien786534/an-ai-writing-tool-i-reviewed-got-acquired-renamed-and-quietly-disappeared-so-i-audited-pricing-3hih</guid>
      <description>&lt;p&gt;Narrato was one of the AI writing tools I'd had listed and priced on my AI-writing-tools comparison site since early 2026. It had a content calendar, an AI writing assistant, and its own pricing page. When I went back in October to re-verify its numbers as part of a routine audit, narrato.io didn't load its pricing page at all — it 301-redirected to typeface.ai.&lt;/p&gt;

&lt;p&gt;Narrato was acquired by Typeface in September 2024. There's no public standalone pricing anymore; it's been folded into Typeface's enterprise content platform. I'd been carrying a dead price tag on a product that, as a standalone thing a reader could sign up for, no longer exists.&lt;/p&gt;

&lt;p&gt;That discovery is what turned a routine pricing check into a full audit of all 55 tools on the site, re-verified one by one against each vendor's actual current pricing page rather than whatever I'd written down when the entry was first created. Some of what I found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jasper&lt;/strong&gt;: the Creator plan at $49/month doesn't exist anymore. Current pricing is Pro at $59/month (billed annually) or $69/month (billed monthly), and the "100,000+ clients" marketing claim I'd been repeating had no source I could verify, so it came out rather than staying in as an unsourced number.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepL Write&lt;/strong&gt;: I had it listed as "included in DeepL Pro." It isn't. Write Pro is a separate add-on at EUR 6.99/user/month, billed annually, on top of a DeepL Pro subscription.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rytr&lt;/strong&gt;: priced at Saver $9 / Unlimited $29. The real current structure is Unlimited at EUR 7.50/month or Premium at EUR 24.16/month, both billed annually — different currency, different tier names, different numbers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fliki&lt;/strong&gt;: I had Standard at $21 and Premium at $66. Live pricing is $28 and $88, billed monthly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clearscope&lt;/strong&gt;: listed at $189/month, actually $129/month.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are small typos. Each one is a case where the vendor changed something — a plan name, a currency, a billing cadence, an entire go-to-market motion — and the old number kept sitting there looking confident and specific, which is exactly what makes a wrong price more damaging than an honest "contact us."&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that's easy to get wrong when you fix this
&lt;/h2&gt;

&lt;p&gt;The tempting shortcut is to treat "verify pricing" as "update the number." It isn't — it's "read the vendor's current pricing page and write down only what's actually there." A few of the corrections above required reading the page closely enough to notice that a tier had been renamed, not just repriced (DeepL's bundling structure changed, Rytr's billing currency and cadence changed, not just the digits). A find-and-replace on the old number would have produced a technically-updated page that was still wrong in its surrounding sentences.&lt;/p&gt;

&lt;p&gt;The other temptation is to keep a dead entry like Narrato's around because deleting content feels like losing SEO value. I didn't delete it — I rewrote it in the past tense, with its acquisition and redirect documented, rather than leaving a live-sounding pricing table for a product you can no longer actually subscribe to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I'm writing this down
&lt;/h2&gt;

&lt;p&gt;If you maintain any kind of "best AI tools for X" page, the AI tooling market in 2026 is genuinely volatile enough that a once-a-year pricing check isn't enough. Acquisitions fold products into other products. Currencies and billing cadences change without a rename. And the error that costs you the most trust isn't the one that's obviously wrong — it's the one that still looks exactly as confident and specific as it did the day you wrote it.&lt;/p&gt;

&lt;p&gt;The fact-checked comparison, including the updated Narrato entry and all 55 re-verified tool pages, is live at &lt;a href="https://aiwritingcompare.com/guides" rel="noopener noreferrer"&gt;aiwritingcompare.com/guides&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>writing</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Windsurf and Codeium Didn't Just Get Acquired — They Disappeared Into Devin</title>
      <dc:creator>SIKOUTRIS</dc:creator>
      <pubDate>Thu, 22 Oct 2026 12:16:47 +0000</pubDate>
      <link>https://dev.to/julien786534/windsurf-and-codeium-didnt-just-get-acquired-they-disappeared-into-devin-1f61</link>
      <guid>https://dev.to/julien786534/windsurf-and-codeium-didnt-just-get-acquired-they-disappeared-into-devin-1f61</guid>
      <description>&lt;p&gt;If you've been comparing AI coding assistants any time in the last year, you've probably bookmarked a page for Windsurf or Codeium. I did too — both had dedicated entries on the AI-coding-tools comparison site I maintain, each with their own pricing table, feature list, and "vs Cursor" comparison page.&lt;/p&gt;

&lt;p&gt;Then, while doing a routine pricing re-check in October 2026, I ran &lt;code&gt;curl -L&lt;/code&gt; against both root domains to confirm the numbers were still accurate. Neither one resolved to itself. &lt;code&gt;windsurf.com&lt;/code&gt; and &lt;code&gt;codeium.com&lt;/code&gt; both 301-redirect straight to &lt;code&gt;devin.ai&lt;/code&gt; — Cognition's product, the one best known for its "AI software engineer" positioning.&lt;/p&gt;

&lt;p&gt;This wasn't a rumor I read somewhere. It's the kind of thing you only notice if you're maintaining a dataset that has to stay honest: the vendor's own infrastructure told me, via an HTTP status code, that two products I'd been tracking as separate competitors no longer independently exist.&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually happened
&lt;/h2&gt;

&lt;p&gt;Codeium (the autocomplete/agent company) rebranded to Windsurf earlier in 2026, and Windsurf was then absorbed into Cognition — the company behind Devin — consolidating what used to be three brand names into one. If you go looking for Windsurf or Codeium pricing today, you won't find one. You'll find Devin's pricing instead: a free tier, Pro at $20/month, and Max plans starting at $100/month for 5x or 20x usage, verified directly on devin.ai/pricing.&lt;/p&gt;

&lt;p&gt;For a comparison site, this is a genuinely annoying problem, because "annoying for the maintainer" usually means "actively misleading for the reader" if you don't fix it. Keeping the old Windsurf-vs-Cursor and Codeium-vs-Copilot pages live and un-updated would have meant serving two confidently-written reviews of products that, strictly speaking, don't have an independent pricing page to point to anymore.&lt;/p&gt;

&lt;h2&gt;
  
  
  The smaller, uglier discovery
&lt;/h2&gt;

&lt;p&gt;While I was in there fixing the merger, I also re-checked Tabnine, which I had priced at a flat $15/month. That number is stale too — tabnine.com/pricing now redirects to a Tricentis contact form. Tabnine's pivot into enterprise/quote-based pricing isn't as dramatic as a full product merger, but it's the same underlying lesson: a comparison site that doesn't re-verify its sources on a schedule will quietly start lying to its readers, one silently-changed pricing page at a time.&lt;/p&gt;

&lt;p&gt;And the opposite failure mode is just as real. Re-checking Cursor's pricing from its live JSON-LD &lt;code&gt;Offer&lt;/code&gt; schema (rather than trusting what I'd written down months earlier) turned up a full tier structure I'd been missing: Hobby (free), Pro ($20), Pro+ ($60), Ultra ($200), and Teams ($40/user/month). The fabricated-looking "100 reviews" count sitting in the page's structured data had to go too — there was no actual review data behind it, just a stale default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters more for AI coding tools specifically
&lt;/h2&gt;

&lt;p&gt;This category moves faster than most SaaS verticals. In a market where funding rounds and acquisitions happen on a quarterly cadence, a "best AI coding assistant" page that isn't re-verified against the vendor's actual, current pricing page is worse than no page at all — it actively erodes trust in whatever is accurate on the rest of the site.&lt;/p&gt;

&lt;p&gt;The fix, in the end, wasn't complicated: merge the Windsurf and Codeium entries into one sourced "Devin (formerly Windsurf/Codeium)" listing, keep the comparison pages but update their verdicts, and add a visible "price checked on [date], sourced from [vendor URL]" line to every tool page so readers can judge staleness for themselves instead of trusting a number that might be six months old.&lt;/p&gt;

&lt;p&gt;If you maintain any kind of tools directory, comparison site, or "state of X in 2026" page: the acquisitions you don't track are the ones that'll embarrass you. I've started treating root-domain redirects as a signal worth checking on a recurring basis, not just when something looks obviously broken.&lt;/p&gt;

&lt;p&gt;The updated comparison, including the merged Devin/Windsurf/Codeium entry, is live at &lt;a href="https://aicodingcompare.com/alternative/cursor/" rel="noopener noreferrer"&gt;aicodingcompare.com/alternative/cursor&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>What Running 70+ Small Sites Solo Taught Me About Choosing Project Management Software</title>
      <dc:creator>SIKOUTRIS</dc:creator>
      <pubDate>Tue, 20 Oct 2026 13:10:39 +0000</pubDate>
      <link>https://dev.to/julien786534/what-running-70-small-sites-solo-taught-me-about-choosing-project-management-software-57g5</link>
      <guid>https://dev.to/julien786534/what-running-70-small-sites-solo-taught-me-about-choosing-project-management-software-57g5</guid>
      <description>&lt;p&gt;I run a one-person digital publishing operation: a portfolio of several dozen small, independent websites, each with its own content cadence, maintenance tasks, and SEO work. No team, no account managers, just me and a rotating set of recurring tasks across a lot of unrelated "projects."&lt;/p&gt;

&lt;p&gt;For a long time I tried to manage this with whatever project management tool was popular that year, and every single one of them fought me in the same way: they were built for a 10-person team shipping one product, not for one person juggling 70 small, mostly-independent workstreams.&lt;/p&gt;

&lt;p&gt;Here's what I eventually learned actually matters when you're evaluating PM software at this kind of scale, which is different from the advice aimed at growing teams.&lt;/p&gt;

&lt;h3&gt;
  
  
  Per-seat pricing is the wrong lens entirely
&lt;/h3&gt;

&lt;p&gt;Most PM tools price around headcount, which makes sense for a team but is irrelevant when there's one of you. The real cost driver at solo-portfolio scale is how many "projects" or "spaces" you can create before the plan forces you to pay more — because you don't have 1 project, you have dozens. I've been quietly pushed into enterprise tiers by project-count caps more often than by user caps.&lt;/p&gt;

&lt;h3&gt;
  
  
  Recurring task templates need to survive at volume
&lt;/h3&gt;

&lt;p&gt;A lot of my work is the same task repeated across many sites on a schedule: a quarterly content audit, a monthly backlink check, a weekly indexation review. Tools that handle recurring tasks gracefully for 5 projects often become unusable at 70, because there's no good way to template a task across many projects at once without either a script against an API or hours of manual setup. If a tool doesn't expose task creation through an API, assume you'll eventually write a workaround or abandon it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data portability matters more than the feature list
&lt;/h3&gt;

&lt;p&gt;When you're the only person who will ever audit your own task history, lock-in risk is personal: if the export is bad, you lose your own institutional memory, not a team's. I now treat "can I get a clean CSV or API dump of everything, including completed task history" as a harder requirement than any kanban/gantt/calendar view.&lt;/p&gt;

&lt;h3&gt;
  
  
  Views built for sprints don't match a maintenance cadence
&lt;/h3&gt;

&lt;p&gt;Sprint-based tools assume you're building toward a release. A lot of small-site operation work isn't sprint-shaped — it's maintenance-shaped: recurring, low-urgency, easy to lose track of across many unrelated properties. A flat, filterable task list that can be sliced by site/tag turned out to matter more to me than any sprint board ever has.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I'd actually tell someone shopping for this
&lt;/h3&gt;

&lt;p&gt;If you're in a similar spot — a solo operator or very small team managing many small, mostly independent projects rather than one big one — don't start from "what do growing startups use." Start from: can I create and update tasks programmatically, does pricing scale with project count instead of just seats, and can I get my data back out cleanly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://softwarerundown.com/best-project-management-software-2026-comparison" rel="noopener noreferrer"&gt;Software Rundown's project management comparison&lt;/a&gt; is a reasonable starting point if you want a side-by-side on pricing and core features across eight of the mainstream options — useful for narrowing the field before you test the two or three that might actually fit a portfolio-style workflow rather than a single-team one.&lt;/p&gt;

&lt;p&gt;None of this is a knock on PM tools generally — they're built for the use case most of their customers have, which is one team shipping one thing. It just means that if your situation looks like mine, the usual "best PM tool" rankings are optimizing for a different problem than the one you actually have.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>saas</category>
      <category>smallbusiness</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>Making Tax Digital for ITSA: what the quarterly API actually wants from your bookkeeping</title>
      <dc:creator>SIKOUTRIS</dc:creator>
      <pubDate>Mon, 19 Oct 2026 09:28:12 +0000</pubDate>
      <link>https://dev.to/julien786534/making-tax-digital-for-itsa-what-the-quarterly-api-actually-wants-from-your-bookkeeping-1on0</link>
      <guid>https://dev.to/julien786534/making-tax-digital-for-itsa-what-the-quarterly-api-actually-wants-from-your-bookkeeping-1on0</guid>
      <description>&lt;p&gt;If you're a UK sole trader or landlord who also happens to write code — and a lot of freelance developers are exactly that — you've probably noticed HMRC's Making Tax Digital for Income Tax Self Assessment (MTD ITSA) creeping into your admin this year. It's live for anyone with qualifying self-employment or property income above £50,000, and it changes something that used to be a once-a-year chore into a quarterly one.&lt;/p&gt;

&lt;p&gt;The first deadline (7 August 2026, covering the 6 April–5 July quarter) has already passed for most people in scope. The next one — 7 November 2026, covering 6 July–5 October — is the one actually worth planning for now, because it's the first time the "quarterly habit" either sticks or doesn't.&lt;/p&gt;

&lt;h3&gt;
  
  
  The deadline math is simple, the formula isn't obvious
&lt;/h3&gt;

&lt;p&gt;HMRC's rule is: the 7th of the second month after the quarter ends. That gives you four fixed dates for a standard tax-year quarter split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Q1 (6 Apr–5 Jul) → 7 August&lt;/li&gt;
&lt;li&gt;Q2 (6 Jul–5 Oct) → 7 November&lt;/li&gt;
&lt;li&gt;Q3 (6 Oct–5 Jan) → 7 February&lt;/li&gt;
&lt;li&gt;Q4 (6 Jan–5 Apr) → 7 May&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can elect calendar-quarter alignment instead at sign-up, but once you've picked, you're locked into it for the year — so if you're scripting reminders or calendar events, build them from your actual elected quarter type, not the tax-year default.&lt;/p&gt;

&lt;h3&gt;
  
  
  What "a quarterly update" actually is
&lt;/h3&gt;

&lt;p&gt;This trips people up: it is not a detailed ledger submission. HMRC wants a digital summary — categorised totals of income and expenses for the three-month period, submitted through MTD-compatible software via API. No receipts, no line-by-line transaction list, no supporting documents at this stage. That's a deliberate design choice to keep the quarterly burden light; the detail only matters at the year-end final declaration.&lt;/p&gt;

&lt;p&gt;For anyone maintaining their own tracking (a spreadsheet, a small internal tool, a script pulling from a bank feed), the practical implication is that your categorisation scheme matters more than your transaction-level detail. If your expense categories don't map cleanly onto HMRC's self-employment categories (ask yourself: can I produce "total turnover" and "total expenses by type" for this quarter in one query?), you'll be doing manual reclassification work every quarter instead of once a year. Worth fixing before Q2 data entry, not after.&lt;/p&gt;

&lt;h3&gt;
  
  
  The penalty system has a soft landing — for now
&lt;/h3&gt;

&lt;p&gt;For the 2026/27 tax year, there are no penalty points for a late quarterly submission. That changes from April 2027: each missed deadline after that earns a point, four points trigger a £200 fine, and every subsequent missed deadline after that adds another £200. Points expire after 24 months of on-time compliance. So right now there's real room to get the workflow right without a financial penalty attached to getting it wrong — which is exactly the window to build (or fix) the automation rather than wait.&lt;/p&gt;

&lt;h3&gt;
  
  
  One practical note on timing
&lt;/h3&gt;

&lt;p&gt;Submission is via API, and the sensible deadline to target isn't 23:59 on 7 November — it's a day or two earlier. API load spikes near statutory deadlines are a known pattern with HMRC's systems (MTD VAT saw the same thing), and "the portal was slow" is not a defence that holds up well in a compliance context.&lt;/p&gt;

&lt;p&gt;If you want the fuller walkthrough of the submission process and the HMRC-recognised software options, finance-journal.co.uk has a &lt;a href="https://finance-journal.co.uk/mtd-itsa-quarterly-updates-how-to-submit" rel="noopener noreferrer"&gt;detailed guide to the MTD ITSA quarterly submission process&lt;/a&gt; that covers the mechanics end to end.&lt;/p&gt;

</description>
      <category>uk</category>
      <category>tax</category>
      <category>freelance</category>
      <category>api</category>
    </item>
    <item>
      <title>Die EZB hat 2026 die Zinsen erhöht, nicht gesenkt – eine Lektion in Content-Pflege</title>
      <dc:creator>SIKOUTRIS</dc:creator>
      <pubDate>Sat, 17 Oct 2026 14:10:33 +0000</pubDate>
      <link>https://dev.to/julien786534/die-ezb-hat-2026-die-zinsen-erhoht-nicht-gesenkt-eine-lektion-in-content-pflege-9bi</link>
      <guid>https://dev.to/julien786534/die-ezb-hat-2026-die-zinsen-erhoht-nicht-gesenkt-eine-lektion-in-content-pflege-9bi</guid>
      <description>&lt;p&gt;Anfang 2026 war sich die Finanzpresse ziemlich einig: Die EZB würde ihren Leitzins im Laufe des Jahres weiter senken, die Zeit der hohen Zinsen sei vorbei. Ich pflege unter anderem &lt;a href="https://kapital-spiegel.de" rel="noopener noreferrer"&gt;Kapital-Spiegel&lt;/a&gt;, einen deutschsprachigen Ratgeber zu Geldanlage, Steuern und Vorsorge, und hatte entsprechend einen Artikel über die Aktienmarkt-Aussichten fürs dritte Quartal mit genau dieser Prämisse geschrieben: sinkende Zinsen, steigende Bewertungen.&lt;/p&gt;

&lt;p&gt;Die Prämisse war falsch. Und das Nachziehen war eine gute Übung in Content-Hygiene.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was tatsächlich passiert ist
&lt;/h2&gt;

&lt;p&gt;Die Inflation in der Eurozone zog im Sommer wieder an: 2,9 Prozent im Juli, 3,3 Prozent im August. Statt zu lockern, hat die EZB nachgezogen. Am 10. September 2026 wurde der Einlagesatz um 0,25 Prozentpunkte auf 2,50 Prozent angehoben, der Hauptrefinanzierungssatz auf 2,65 Prozent, wirksam ab dem 16. September. Keine Trendwende nach unten, sondern die zweite Anhebung des Jahres.&lt;/p&gt;

&lt;p&gt;Für einen Ratgeber, der Lesern erklären soll, wo sie ihr Erspartes 2026 am besten parken, ist das kein Detail. Eine Prognose, die "sinkende Zinsen" unterstellt, führt zu falschen Handlungsempfehlungen – etwa dazu, sich jetzt einen vermeintlich "letzten guten" Festgeldzins zu sichern, obwohl das Gegenteil der Fall war.&lt;/p&gt;

&lt;h2&gt;
  
  
  Die Lehre: Zinsprognosen sind keine Fakten, EZB-Beschlüsse schon
&lt;/h2&gt;

&lt;p&gt;Ich habe daraufhin durchgesehen, welche Artikel auf der Seite Zinsentwicklungen als Fakt behandelten, die eigentlich nur Prognosen waren, und wo tatsächliche EZB-Beschlüsse zitiert wurden. Das klingt banal, ist es aber nicht: In Finanzartikeln, die über Monate online bleiben, vermischen sich schnell "die EZB wird wahrscheinlich senken" (Stand: Zeitpunkt der Veröffentlichung) und "der Leitzins liegt bei X Prozent" (muss laufend aktualisiert werden, sonst wird aus einer Momentaufnahme eine falsche Tatsachenbehauptung).&lt;/p&gt;

&lt;p&gt;Ein Beispiel, das sich sauber lösen ließ: In einem Artikel über &lt;a href="https://kapital-spiegel.de/fintech-neobanken-bankwesen" rel="noopener noreferrer"&gt;Neobanken und die Fintech-Revolution in Deutschland&lt;/a&gt; ging es unter anderem darum, wie Anbieter wie Trade Republic ihre Girokonto-Verzinsung an den EZB-Einlagesatz koppeln. Der Mechanismus selbst war richtig beschrieben – aber der zitierte Zinssatz war der von vor der Erhöhung. Nach der Korrektur liegt die verzinste Einlage bei Trade Republic nun bei den aktuellen 2,50 Prozent, exakt dem EZB-Einlagesatz nach dem Beschluss vom September.&lt;/p&gt;

&lt;h2&gt;
  
  
  Was das für Sparer praktisch bedeutet
&lt;/h2&gt;

&lt;p&gt;Zwei Dinge, die über die Korrektur eines einzelnen Artikels hinausgehen:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tagesgeld- und Neobank-Zinsen folgen der EZB fast verzögerungsfrei.&lt;/strong&gt; Wer sein Geld bei einem Anbieter liegen hat, der den Einlagesatz direkt weitergibt, hat die Zinserhöhung im September automatisch mitbekommen, ohne selbst etwas zu tun. Das ist der eigentliche Vorteil solcher Produkte gegenüber klassischen Tagesgeldkonten, bei denen Banken Erhöhungen oft erst mit Verzögerung und nicht vollständig weitergeben.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Die Realverzinsung bleibt trotzdem knapp.&lt;/strong&gt; Bei 2,50 Prozent nominalem Einlagesatz und einer Inflation von 3,3 Prozent im August liegt die reale Rendite auf Tagesgeld weiterhin im negativen Bereich. Die Zinserhöhung ist eine Reaktion auf die Inflation, kein Ausgleich dafür. Für die Einordnung "lohnt sich Tagesgeld jetzt wieder" ist das der entscheidende Unterschied zwischen nominalem und realem Zins, der in vielen Vergleichsportalen unter den Tisch fällt.&lt;/p&gt;

&lt;p&gt;Der nächste EZB-Zinsentscheid steht am 29. Oktober 2026 an. Ob es dabei zu einer weiteren Anhebung, einer Pause oder einer ersten Senkung kommt, werde ich nicht vorhersagen – aber ich werde dieses Mal die bestehenden Artikel zeitnah nachziehen, statt eine Prognose als Dauerzustand stehen zu lassen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wie ich das jetzt systematisch angehe
&lt;/h2&gt;

&lt;p&gt;Eine Korrektur reicht nicht, wenn das Grundproblem strukturell ist. Ich habe für Kapital-Spiegel inzwischen eine einfache Regel: Jeder Artikel, der eine konkrete Zinsangabe (Leitzins, Einlagesatz, Tagesgeldzins eines bestimmten Anbieters) enthält, bekommt ein Änderungsdatum direkt neben der Zahl im Text, nicht nur im Impressum oder im &lt;code&gt;dateModified&lt;/code&gt;-Feld. Das zwingt beim nächsten Update dazu, die Zahl aktiv zu bestätigen oder zu korrigieren, statt sie stillschweigend stehen zu lassen. Zusätzlich verlinke ich Zinsangaben, wo möglich, auf die offizielle EZB-Pressemitteilung des jeweiligen Beschlusses statt auf eine Sekundärquelle – dann ist beim Leser und bei mir selbst sofort ersichtlich, ob die Zahl noch zum zitierten Beschluss passt.&lt;/p&gt;

&lt;p&gt;Für einen Ein-Personen-Betrieb, der mehrere Fachseiten pflegt, ist das kein Luxusproblem. Zinsentscheide sind planbare Ereignisse – die EZB tagt nach festem Kalender –, und genau deshalb lässt sich ein Review-Rhythmus dafür einrichten, statt auf zufällige Leserkommentare zu warten, die auf veraltete Zahlen hinweisen.&lt;/p&gt;

</description>
      <category>finance</category>
      <category>fintech</category>
      <category>writing</category>
      <category>data</category>
    </item>
    <item>
      <title>The EU's Green Claims Crackdown Is No Longer Theoretical: Inside the May 2026 Infringement Wave</title>
      <dc:creator>SIKOUTRIS</dc:creator>
      <pubDate>Mon, 12 Oct 2026 09:28:21 +0000</pubDate>
      <link>https://dev.to/julien786534/the-eus-green-claims-crackdown-is-no-longer-theoretical-inside-the-may-2026-infringement-wave-kek</link>
      <guid>https://dev.to/julien786534/the-eus-green-claims-crackdown-is-no-longer-theoretical-inside-the-may-2026-infringement-wave-kek</guid>
      <description>&lt;p&gt;On 27 September 2026, the ban on generic, unsubstantiated environmental claims under Directive (EU) 2024/825 — the "Empowering Consumers for the Green Transition" directive — became fully applicable across the EU. Terms like "eco-friendly," "carbon neutral," or "green" can no longer be used on packaging or marketing without the kind of recognised, verifiable backing the directive requires.&lt;/p&gt;

&lt;p&gt;What's less widely reported is what happened a few months earlier, on 28 May 2026: the European Commission opened infringement procedures against 20 member states for incomplete transposition of the directive. Member states had until 27 March 2026 to transpose it into national law — a deadline a majority of them missed, at least partially.&lt;/p&gt;

&lt;p&gt;That gap matters for anyone running a compliance or marketing team across several EU markets. A claim that's clearly banned under the directive's EU-wide wording may still sit in a legal grey zone in a country whose national transposition is incomplete, delayed, or diverges on enforcement detail (penalties, the specific list of restricted terms, who enforces what). Compliance isn't binary at EU scale — it's 27 overlapping timelines.&lt;/p&gt;

&lt;h3&gt;
  
  
  What we built to track this
&lt;/h3&gt;

&lt;p&gt;We maintain &lt;a href="https://greenwashing-checker.com" rel="noopener noreferrer"&gt;greenwashing-checker.com&lt;/a&gt;, a scanner that checks a given page's wording against the terms the ECGT framework restricts or bans outright. The part that took longer to get right wasn't the term-matching — it's keeping the per-country transposition status current enough to be useful, rather than a snapshot from the day the directive was adopted.&lt;/p&gt;

&lt;p&gt;In practice that means treating "is this claim compliant" as a question with two layers: the EU-wide baseline (what the directive itself prohibits, applicable since 27 September 2026) and the national layer (has this country actually transposed it, and if not, what's the practical enforcement risk in the meantime). The May infringement wave is a useful real-world marker for that second layer — it's the Commission's own signal of where transposition is lagging, sourced from its official infringement decisions rather than from guesswork.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this matters beyond the legal department
&lt;/h3&gt;

&lt;p&gt;For marketing and product teams, the practical takeaway is that "we checked against the directive" isn't the same as "we checked against what's actually enforceable in each market we sell into." A claim can be clean under the EU text and still risky in a country where enforcement bodies are already active on national consumer-protection law, directive or no directive.&lt;/p&gt;

&lt;p&gt;We wrote up the specific terms the directive restricts, and how we map claims against them, in our &lt;a href="https://greenwashing-checker.com/en/ecgt-compliance-guide/" rel="noopener noreferrer"&gt;compliance guide&lt;/a&gt;. If you're building anything that touches green claims — product pages, ad copy, packaging text — it's worth checking where your target markets actually stand on transposition before assuming the EU-wide deadline is the only clock running.&lt;/p&gt;

</description>
      <category>sustainability</category>
      <category>compliance</category>
      <category>regulation</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Construire une plateforme de formation en ligne : WordPress, LearnDash et SureCart en pratique</title>
      <dc:creator>SIKOUTRIS</dc:creator>
      <pubDate>Fri, 09 Oct 2026 10:40:45 +0000</pubDate>
      <link>https://dev.to/julien786534/construire-une-plateforme-de-formation-en-ligne-wordpress-learndash-et-surecart-en-pratique-2hp4</link>
      <guid>https://dev.to/julien786534/construire-une-plateforme-de-formation-en-ligne-wordpress-learndash-et-surecart-en-pratique-2hp4</guid>
      <description>&lt;p&gt;Quand on migre un organisme de formation vers une plateforme e-learning autonome, la partie pédagogie est souvent plus simple à poser que la partie paiement. Voici ce qu'on a appris en construisant atelier-formation.fr, un organisme certifié Qualiopi qui propose des formations asynchrones (Excel, WordPress, création d'entreprise) accessibles 24/7.&lt;/p&gt;

&lt;h2&gt;
  
  
  LearnDash pour la structure pédagogique
&lt;/h2&gt;

&lt;p&gt;LearnDash gère proprement la hiérarchie cours / leçons / topics / quiz, avec un suivi de progression natif. Rien d'exotique ici — c'est la brique la plus mature de la stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  SureCart : le piège de la clé API
&lt;/h2&gt;

&lt;p&gt;L'intégration SureCart par défaut passe par un flux OAuth dans l'interface WordPress. Mais en lisant le code source du plugin (&lt;code&gt;ActivationService.php&lt;/code&gt;), on découvre que le jeton est stocké dans une option WordPress nommée &lt;code&gt;sc_api_token&lt;/code&gt; — et non &lt;code&gt;surecart_api_token&lt;/code&gt; comme on pourrait le deviner. Une fois qu'on le sait, il devient possible d'injecter directement le jeton et l'identifiant de compte dans &lt;code&gt;wp_options&lt;/code&gt; pour activer le compte sans repasser par l'écran de connexion à chaque migration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le format d'API qui coûte une heure de debug
&lt;/h2&gt;

&lt;p&gt;Autre détail qui fait perdre du temps : l'endpoint &lt;code&gt;/v1/prices&lt;/code&gt; de l'API SureCart exige que le payload soit encapsulé dans un objet &lt;code&gt;{"price": {...}}&lt;/code&gt;. Sans cet enveloppement, l'API renvoie une erreur peu explicite. Une fois corrigé, la création de produits et de tarifs par script devient triviale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stripe Connect : la limite de l'automatisation
&lt;/h2&gt;

&lt;p&gt;Contrairement au reste de l'intégration, l'activation de Stripe Connect ne peut pas être automatisée via l'API : SureCart impose de passer par son interface OAuth pour relier un compte Stripe. C'est la seule étape qui reste manuelle dans toute la chaîne de mise en vente d'une formation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Le lien LearnDash &amp;lt;-&amp;gt; SureCart
&lt;/h2&gt;

&lt;p&gt;Les deux produits se connectent via le fournisseur d'intégration &lt;code&gt;surecart/learndash-course&lt;/code&gt;, qui associe un &lt;code&gt;price_id&lt;/code&gt; SureCart à un &lt;code&gt;course_id&lt;/code&gt; LearnDash. Une fois le paiement confirmé, l'inscription au cours se fait automatiquement, sans webhook à écrire soi-même.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ce qu'on retient
&lt;/h2&gt;

&lt;p&gt;Si vous migrez un organisme de formation vers une pile WordPress + LearnDash + SureCart, prévoyez du temps pour l'inspection du code plutôt que la seule documentation officielle — les options de configuration réelles ne correspondent pas toujours aux noms qu'on devine. Le détail du fonctionnement complet (catalogue, financements, méthode pédagogique) est disponible sur &lt;a href="https://www.atelier-formation.fr/se-former-en-ligne-professionnellement/" rel="noopener noreferrer"&gt;le guide complet de la formation en ligne professionnelle d'Atelier Formation&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>wordpress</category>
    </item>
    <item>
      <title>Pendlerpauschale 2026: Warum sich der Pendlereuro verdreifacht hat</title>
      <dc:creator>SIKOUTRIS</dc:creator>
      <pubDate>Fri, 09 Oct 2026 10:40:19 +0000</pubDate>
      <link>https://dev.to/julien786534/pendlerpauschale-2026-warum-sich-der-pendlereuro-verdreifacht-hat-1k87</link>
      <guid>https://dev.to/julien786534/pendlerpauschale-2026-warum-sich-der-pendlereuro-verdreifacht-hat-1k87</guid>
      <description>&lt;p&gt;Wer regelmäßig zur Arbeit pendelt, kennt die Pendlerpauschale – aber die Details sind komplizierter, als der Name vermuten lässt. Es gibt zwei getrennte Pauschalen, die von unterschiedlichen Voraussetzungen abhängen, plus einen separaten Pendlereuro, der sich 2026 spürbar verändert hat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kleine vs. große Pendlerpauschale
&lt;/h2&gt;

&lt;p&gt;Die kleine Pendlerpauschale gilt, wenn die Benutzung öffentlicher Verkehrsmittel für den Arbeitsweg zumutbar ist. Sie beginnt ab einer einfachen Wegstrecke von 20 km:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ab 20 km: 696 € pro Jahr&lt;/li&gt;
&lt;li&gt;ab 40 km: 1.356 € pro Jahr&lt;/li&gt;
&lt;li&gt;ab 60 km: 2.016 € pro Jahr&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Die große Pendlerpauschale greift, wenn die Benützung öffentlicher Verkehrsmittel nicht möglich oder nicht zumutbar ist – etwa in ländlichen Gebieten ohne ausreichende Anbindung oder bei Schichtarbeit außerhalb der Betriebszeiten des öffentlichen Verkehrs. Sie beginnt schon ab 2 km:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ab 2 km: 372 € pro Jahr&lt;/li&gt;
&lt;li&gt;ab 20 km: 1.476 € pro Jahr&lt;/li&gt;
&lt;li&gt;ab 40 km: 2.568 € pro Jahr&lt;/li&gt;
&lt;li&gt;ab 60 km: 3.672 € pro Jahr&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Der Pendlereuro: von 2 € auf 6 € pro Kilometer
&lt;/h2&gt;

&lt;p&gt;Neben der Pauschale gibt es den Pendlereuro, der direkt von der Steuer abgezogen wird (kein Freibetrag, sondern ein Absetzbetrag). Er wird pro Kilometer der einfachen Fahrtstrecke und pro Jahr berechnet. 2026 wurde er verdreifacht: von 2 € auf 6 € pro Kilometer. Für jemanden mit 40 km einfacher Fahrtstrecke bedeutet das einen Unterschied von 80 € auf 240 € Pendlereuro pro Jahr – zusätzlich zur Pauschale selbst.&lt;/p&gt;

&lt;h2&gt;
  
  
  Warum das in der Praxis oft übersehen wird
&lt;/h2&gt;

&lt;p&gt;Viele Arbeitnehmer kennen nur die Pauschale, nicht den separaten Pendlereuro – oder sie verwechseln kleine und große Pauschale, weil die Grenze (öffentliche Verkehrsmittel zumutbar oder nicht) nicht immer eindeutig ist. Gerade bei Schichtarbeit oder bei Wohnortwechsel während des Jahres lohnt sich eine genaue Nachrechnung, weil sich beide Pauschalen aliquot auf den tatsächlichen Zeitraum beziehen.&lt;/p&gt;

&lt;p&gt;Wer die eigene Situation durchrechnen will, findet einen &lt;a href="https://steuer-rechner.at/pendlerpauschale-2026-oesterreich-berechnen" rel="noopener noreferrer"&gt;Pendlerpauschale-Rechner für 2026 auf steuer-rechner.at&lt;/a&gt;, der beide Varianten und den Pendlereuro gemeinsam berücksichtigt.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>career</category>
    </item>
    <item>
      <title>De ketenregeling in Nederland: wanneer wordt een tijdelijk contract automatisch vast?</title>
      <dc:creator>SIKOUTRIS</dc:creator>
      <pubDate>Fri, 09 Oct 2026 10:40:14 +0000</pubDate>
      <link>https://dev.to/julien786534/de-ketenregeling-in-nederland-wanneer-wordt-een-tijdelijk-contract-automatisch-vast-1hcm</link>
      <guid>https://dev.to/julien786534/de-ketenregeling-in-nederland-wanneer-wordt-een-tijdelijk-contract-automatisch-vast-1hcm</guid>
      <description>&lt;p&gt;Bij tijdelijke arbeidscontracten in Nederland geldt een regel die werkgevers en werknemers vaak onderschatten: de ketenregeling. Ze bepaalt wanneer een reeks tijdelijke contracten automatisch overgaat in een vast contract — zonder dat daar een handtekening voor nodig is.&lt;/p&gt;

&lt;h2&gt;
  
  
  De basisregel: 3 contracten, 3 jaar
&lt;/h2&gt;

&lt;p&gt;Een werkgever mag maximaal 3 opeenvolgende tijdelijke contracten met dezelfde werknemer afsluiten, met een totale duur van maximaal 3 jaar. Zodra een van beide grenzen wordt overschreden — een vierde contract, of een periode langer dan 3 jaar — wordt het lopende contract van rechtswege een vast contract. Er is geen aparte handeling nodig; het gebeurt automatisch op het moment van overschrijding.&lt;/p&gt;

&lt;h2&gt;
  
  
  De tussenpoos die de keten doorbreekt
&lt;/h2&gt;

&lt;p&gt;Een onderbreking van meer dan 6 maanden tussen twee contracten breekt de keten: de telling begint daarna opnieuw bij nul. Dit is een veelgemaakte misvatting — werkgevers denken soms dat een kortere pauze (bijvoorbeeld 3 of 4 maanden) al voldoende is, maar dat is niet het geval buiten de cao-uitzondering hieronder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cao-afwijkingen
&lt;/h2&gt;

&lt;p&gt;Voor sommige sectoren kan de cao de regels verruimen: tot 6 contracten, een periode tot 4 jaar, of een tussenpoos die wordt verkort tot 3 maanden in plaats van 6. Dit is vooral relevant in sectoren met veel seizoens- of projectwerk. Check dus altijd de toepasselijke cao voordat je uitgaat van de wettelijke standaardregeling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wat erbij komt: aanzegplicht en transitievergoeding
&lt;/h2&gt;

&lt;p&gt;Los van de ketenregeling geldt bij contracten van 6 maanden of langer de aanzegplicht: de werkgever moet uiterlijk 1 maand voor het einde van het contract schriftelijk laten weten of het wordt voortgezet. Wordt dat verzuimd, dan is de werkgever een vergoeding verschuldigd van maximaal 1 maandsalaris. Daarnaast bouwt een werknemer vanaf de eerste dag transitievergoeding op bij beëindiging op initiatief van de werkgever: 1/3 maandsalaris per volledig dienstjaar, met een wettelijk maximum dat jaarlijks wordt geïndexeerd.&lt;/p&gt;

&lt;h2&gt;
  
  
  In de praktijk
&lt;/h2&gt;

&lt;p&gt;Voor wie zelf een tijdelijk arbeidscontract opstelt, is het invullen van de juiste begin- en einddatum maar het begin — de echte valkuil zit in het bijhouden van de keten over meerdere contracten en werkgevers binnen hetzelfde concern. Een overzicht van de regels en een voorbeeld van een correct opgesteld tijdelijk contract staat op &lt;a href="https://contract-maken.nl/arbeidscontract-tijdelijk-2026-regels" rel="noopener noreferrer"&gt;contract-maken.nl&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>career</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Warum § 623 BGB mein KI-Kündigungsgenerator wichtiger war als die KI selbst</title>
      <dc:creator>SIKOUTRIS</dc:creator>
      <pubDate>Thu, 08 Oct 2026 12:18:28 +0000</pubDate>
      <link>https://dev.to/julien786534/warum-ss-623-bgb-mein-ki-kundigungsgenerator-wichtiger-war-als-die-ki-selbst-2lbn</link>
      <guid>https://dev.to/julien786534/warum-ss-623-bgb-mein-ki-kundigungsgenerator-wichtiger-war-als-die-ki-selbst-2lbn</guid>
      <description>&lt;h2&gt;
  
  
  Der Ausgangspunkt
&lt;/h2&gt;

&lt;p&gt;Beim Bau eines KI-gestützten Generators für Kündigungsschreiben nach deutschem Recht war meine erste Annahme falsch: Ich dachte, die eigentliche Schwierigkeit liege im Sprachmodell — gute Formulierungen, korrekte Anrede, passender Ton. Tatsächlich lag die Schwierigkeit woanders: im Formrecht. Dieser Beitrag beschreibt, was ich dabei über § 623 BGB und § 622 BGB gelernt habe, und warum das für jedes Tool in diesem Bereich entscheidend ist.&lt;/p&gt;

&lt;h2&gt;
  
  
  § 623 BGB: Schriftform ist nicht verhandelbar
&lt;/h2&gt;

&lt;p&gt;§ 623 BGB schreibt für die Kündigung eines Arbeitsverhältnisses die &lt;strong&gt;Schriftform&lt;/strong&gt; vor — und schließt dabei die elektronische Form ausdrücklich aus (§ 126 Abs. 3 BGB i.V.m. § 623 BGB). Das bedeutet konkret: Eine Kündigung per E-Mail, SMS oder Messenger ist formunwirksam, unabhängig davon, wie klar der Inhalt ist. Für einen Dokumentengenerator heißt das: Das Ergebnis darf niemals suggerieren, dass eine digitale Übermittlung ausreicht. Jede Ausgabe muss unmissverständlich auf Papier mit eigenhändiger Unterschrift hinweisen — sonst produziert das Tool am Ende ein Dokument, das vor Gericht wirkungslos wäre.&lt;/p&gt;

&lt;p&gt;Das ist der Punkt, an dem viele einfache "Kündigung generieren"-Tools scheitern: Sie optimieren auf einen schön formulierten Text, ohne den Nutzer klar genug auf die Formvorschrift hinzuweisen.&lt;/p&gt;

&lt;h2&gt;
  
  
  § 622 BGB: Fristen sind kein Rundungsproblem
&lt;/h2&gt;

&lt;p&gt;§ 622 BGB regelt die Kündigungsfristen und staffelt sie nach Beschäftigungsdauer beim selben Arbeitgeber. Die Grundkündigungsfrist beträgt vier Wochen zum 15. oder zum Ende eines Kalendermonats; mit zunehmender Betriebszugehörigkeit verlängert sich die Frist für den Arbeitgeber in Stufen. Für ein Tool bedeutet das zwei Dinge:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Die Frist hängt vom &lt;strong&gt;Datum des Zugangs&lt;/strong&gt; der Kündigung ab, nicht vom Ausstellungsdatum — ein Unterschied, der in der Praxis häufig übersehen wird.&lt;/li&gt;
&lt;li&gt;Abweichende, längere Fristen können sich aus &lt;strong&gt;Arbeitsvertrag oder Tarifvertrag&lt;/strong&gt; ergeben und gehen der gesetzlichen Frist vor. Ein generisches Tool kann das nicht wissen, wenn der Nutzer seinen Vertrag nicht angibt — also muss die Ausgabe genau an dieser Stelle transparent machen, was sie &lt;em&gt;nicht&lt;/em&gt; geprüft hat.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Die Grenze, die ein Tool ziehen muss
&lt;/h2&gt;

&lt;p&gt;Das Ergebnis dieser Recherche war weniger "mehr KI-Funktionen", sondern eine klarere Architektur: Das Tool erstellt den Entwurf, weist aber explizit und wiederholt darauf hin, dass es sich nicht um Rechtsberatung handelt und dass die Schriftform (Unterschrift auf Papier) zwingend ist. Diese Nüchternheit ist kein Marketing-Disclaimer, sondern eine direkte Konsequenz aus § 623 BGB — ignoriert man sie, baut man ein Tool, das im entscheidenden Moment versagt.&lt;/p&gt;

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

&lt;p&gt;Wer ein Kündigungstool für den deutschen Markt baut, sollte zuerst die Formvorschriften verstehen, bevor er sich um die Textgenerierung kümmert. Die KI macht den Entwurf lesbarer; das Recht entscheidet, ob er überhaupt wirksam ist. Wer sich für das konkrete Ergebnis interessiert — einen kostenlosen Generator mit Hinweisen zu Schriftform und Fristen für Arbeitsverträge — findet ihn hier: &lt;a href="https://kuendigung-vorlage-ki.de/kuendigung/arbeitsvertrag/" rel="noopener noreferrer"&gt;kuendigung-vorlage-ki.de/kuendigung/arbeitsvertrag&lt;/a&gt;. Keine Rechtsberatung, aber ein Startpunkt, der die Formfehler vermeidet, die am Ende am teuersten sind.&lt;/p&gt;

</description>
      <category>legal</category>
      <category>germany</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
