<?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: Martin Schenk</title>
    <description>The latest articles on DEV Community by Martin Schenk (@martinschenk).</description>
    <link>https://dev.to/martinschenk</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%2F271233%2F8be15adb-2816-49e2-b761-7064e2e0b348.jpg</url>
      <title>DEV Community: Martin Schenk</title>
      <link>https://dev.to/martinschenk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/martinschenk"/>
    <language>en</language>
    <item>
      <title>I auto-published 2,300 AI articles. Google buried 90% of my traffic.</title>
      <dc:creator>Martin Schenk</dc:creator>
      <pubDate>Thu, 16 Jul 2026 15:01:07 +0000</pubDate>
      <link>https://dev.to/martinschenk/i-auto-published-2300-ai-articles-google-buried-90-of-my-traffic-424o</link>
      <guid>https://dev.to/martinschenk/i-auto-published-2300-ai-articles-google-buried-90-of-my-traffic-424o</guid>
      <description>&lt;p&gt;This is the first post on this blog, and it exists because of a failure. So let me start there instead of with a mission statement.&lt;/p&gt;

&lt;p&gt;For sixteen months I ran a content machine on a side project called Startups Españolas. It published on its own, twice a day, no human in the loop. By the time I looked hard at the numbers it had put out around 2,300 articles. I was quietly proud of the pipeline. It was a real piece of software: a Laravel backend, prompts stored in the database, several LLM providers wired in with fallback, automatic publishing straight to the live site. It felt like leverage.&lt;/p&gt;

&lt;p&gt;Then I pulled the Search Console data for the full run and sat with it for a while.&lt;/p&gt;

&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;p&gt;Here is the monthly click trend, straight from the GSC API, nothing rounded in my favor:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Month&lt;/th&gt;
&lt;th&gt;Clicks&lt;/th&gt;
&lt;th&gt;Impressions&lt;/th&gt;
&lt;th&gt;Avg. position&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2025-07&lt;/td&gt;
&lt;td&gt;638&lt;/td&gt;
&lt;td&gt;76,194&lt;/td&gt;
&lt;td&gt;33.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-09&lt;/td&gt;
&lt;td&gt;695&lt;/td&gt;
&lt;td&gt;56,458&lt;/td&gt;
&lt;td&gt;19.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-10&lt;/td&gt;
&lt;td&gt;634&lt;/td&gt;
&lt;td&gt;33,378&lt;/td&gt;
&lt;td&gt;13.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-12&lt;/td&gt;
&lt;td&gt;428&lt;/td&gt;
&lt;td&gt;31,475&lt;/td&gt;
&lt;td&gt;16.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-02&lt;/td&gt;
&lt;td&gt;166&lt;/td&gt;
&lt;td&gt;15,838&lt;/td&gt;
&lt;td&gt;23.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04&lt;/td&gt;
&lt;td&gt;115&lt;/td&gt;
&lt;td&gt;14,969&lt;/td&gt;
&lt;td&gt;22.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-06&lt;/td&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;td&gt;9,236&lt;/td&gt;
&lt;td&gt;32.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Peak was September 2025 at 695 clicks in a month. The last full month, June 2026, did 69. That is a 90% drop. Average position over the same stretch went from roughly 13 back down to around 32, which in plain terms means Google moved my pages from the bottom of page one to the bottom of page three.&lt;/p&gt;

&lt;p&gt;The part that actually stung was the long tail. Over a 90 day window, 1,567 of the pages picked up impressions, so Google had indexed most of the machine's output. But only 147 pages, about 6%, got a single click. I had built two thousand articles to feed a hundred and fifty that did anything, and even those were fading.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I told myself vs. what was true
&lt;/h2&gt;

&lt;p&gt;The story I had been telling myself was "more articles, more surface area, more chances to rank." That is intuitive and it is wrong. More thin pages did not add up to more traffic. They competed with each other for the same weak queries, diluted whatever topical signal the domain had, and gave Google a large pile of near-duplicate, machine-written content to judge the whole site by. That is exactly the kind of thing the helpful-content updates are built to push down.&lt;/p&gt;

&lt;p&gt;The traffic that did exist was not coming from the volume at all. It came from a small handful of genuinely useful startup profiles that happened to rank. The machine was not the asset. Those few real pages were. I had spent the effort on the wrong half.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part where it got embarrassing
&lt;/h2&gt;

&lt;p&gt;If the slow decline was the lesson, the fast one was the wake-up call. The brand was Spanish, es-ES only, on purpose. One day a channel without a language guard generated a batch of posts in English and pushed them live, automatically, onto a Spanish-only site. No human saw them before they were public.&lt;/p&gt;

&lt;p&gt;Nothing catastrophic happened. But that is the whole point of automation without a human gate: the day something does go wrong, it is already live before you know it exists. A pipeline that can publish a good post on its own can publish a bad one on its own, and it will, eventually, at the worst possible moment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually took away
&lt;/h2&gt;

&lt;p&gt;I am not anti-automation. I let AI write most of my code and I am not going to pretend otherwise on a blog about building with it. The lesson is narrower and more useful than "AI content bad":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Volume is not a strategy.&lt;/strong&gt; A new site does not earn authority by producing more. Google rewards depth and trust, not word count. One real article beats five thin ones, and it is not close.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thin content is not neutral, it is a tax.&lt;/strong&gt; Those pages did not just fail to rank. They dragged on everything else on the domain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nothing publishes without a human reading it. Ever.&lt;/strong&gt; This is the hard rule now. The English leak is the proof of why. Auto-publish is the single root cause under both failures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Measure from day one.&lt;/strong&gt; I ran that machine for sixteen months before I really read the data. If I had looked in month three, I would have killed it in month four.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The value is in the content, not the pipeline.&lt;/strong&gt; I built an impressive machine and the reach came from a few good pages. For this blog I deleted the machine idea entirely.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  So what is this blog
&lt;/h2&gt;

&lt;p&gt;This is the opposite bet. It is static, hand-written, and English. There is a small script that gathers what I actually did across my projects each week, git history and working notes, and hands me the raw material. Then I choose one thing worth writing about and write it myself. I read every post before it goes live. There is no CMS, no queue, no provider zoo. When you are reading this, a human decided it was worth your time first.&lt;/p&gt;

&lt;p&gt;I build around a dozen real projects mostly solo, with AI doing a lot of the heavy lifting, and I am going to write honestly about how that actually goes. Some of it works. Some of it is this post. Both are worth showing.&lt;/p&gt;

&lt;p&gt;If that sounds useful, the RSS feed is in the footer. No newsletter popup, no cookie wall. Just the work.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>marketing</category>
      <category>buildinpublic</category>
    </item>
    <item>
      <title>My weekend project for Christmas time: https://youtube.com/shorts/DKbQkU-Jq4o?si=rVPOI2ykWYDPROk2</title>
      <dc:creator>Martin Schenk</dc:creator>
      <pubDate>Fri, 26 Dec 2025 12:22:43 +0000</pubDate>
      <link>https://dev.to/martinschenk/my-weekend-project-for-christmas-time-httpsyoutubecomshortsdkbqku-jq4osirvpoi2ykwydprok2-2do8</link>
      <guid>https://dev.to/martinschenk/my-weekend-project-for-christmas-time-httpsyoutubecomshortsdkbqku-jq4osirvpoi2ykwydprok2-2do8</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://youtube.com/shorts/DKbQkU-Jq4o?si=rVPOI2ykWYDPROk2" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;youtube.com&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>iot</category>
      <category>programming</category>
      <category>showdev</category>
    </item>
    <item>
      <title>How I Built a Production-Ready SaaS in a Weekend (and Open-Sourced It)</title>
      <dc:creator>Martin Schenk</dc:creator>
      <pubDate>Tue, 02 Dec 2025 19:07:57 +0000</pubDate>
      <link>https://dev.to/martinschenk/how-i-built-a-production-ready-saas-in-a-weekend-and-open-sourced-it-2f66</link>
      <guid>https://dev.to/martinschenk/how-i-built-a-production-ready-saas-in-a-weekend-and-open-sourced-it-2f66</guid>
      <description>&lt;p&gt;Every time I started a new SaaS project, I found myself rebuilding the same infrastructure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Payment integration&lt;/li&gt;
&lt;li&gt;Invoice generation&lt;/li&gt;
&lt;li&gt;Multi-language support&lt;/li&gt;
&lt;li&gt;Analytics&lt;/li&gt;
&lt;li&gt;Admin dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the third time, I decided to extract this foundation into a reusable starter. Today, I'm open-sourcing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/martinschenk/saas-starter-stack" rel="noopener noreferrer"&gt;martinschenk/saas-starter-stack&lt;/a&gt;&lt;br&gt;
  &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://allgood.click" rel="noopener noreferrer"&gt;allgood.click&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;## What's Included&lt;/p&gt;

&lt;p&gt;### 1. Stripe Payments&lt;/p&gt;

&lt;p&gt;Complete Stripe Checkout integration with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One-time payments and subscriptions&lt;/li&gt;
&lt;li&gt;Mobile-optimized checkout (auto-detects device)&lt;/li&gt;
&lt;li&gt;EU tax handling&lt;/li&gt;
&lt;li&gt;Webhook processing with signature verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;### 2. Automatic Invoicing&lt;/p&gt;

&lt;p&gt;Zoho Invoice API integration that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates professional PDF invoices on payment&lt;/li&gt;
&lt;li&gt;Sends them automatically to customers&lt;/li&gt;
&lt;li&gt;Supports B2B with company name and VAT ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;### 3. Multi-Language Support (5 Languages)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;English, German, Spanish, French, Portuguese&lt;/li&gt;
&lt;li&gt;SEO-friendly URLs (&lt;code&gt;/de/&lt;/code&gt;, &lt;code&gt;/es/&lt;/code&gt;, &lt;code&gt;/fr/&lt;/code&gt;, &lt;code&gt;/pt/&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Browser language auto-detection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;### 4. GDPR-Compliant Analytics (No Cookies!)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No cookie consent banners needed&lt;/li&gt;
&lt;li&gt;IP anonymization (last octet removed)&lt;/li&gt;
&lt;li&gt;Admin dashboard with charts&lt;/li&gt;
&lt;li&gt;Auto-deletes after 90 days&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;## Tech Stack&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Express.js&lt;/strong&gt; - Simple, no magic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLite&lt;/strong&gt; - Zero config, file-based backup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vanilla JS&lt;/strong&gt; - No build step, ~50KB frontend&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;## Getting Started&lt;/p&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/martinschenk/saas-starter-stack.git" rel="noopener noreferrer"&gt;https://github.com/martinschenk/saas-starter-stack.git&lt;/a&gt;&lt;br&gt;
  cd saas-starter-stack&lt;br&gt;
  npm install&lt;br&gt;
  cp .env.example .env&lt;br&gt;
  npm start&lt;/p&gt;

&lt;p&gt;Visit &lt;code&gt;http://localhost:3000&lt;/code&gt; and you have a working SaaS.&lt;/p&gt;




&lt;p&gt;## Links&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/martinschenk/saas-starter-stack" rel="noopener noreferrer"&gt;martinschenk/saas-starter-stack&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://allgood.click" rel="noopener noreferrer"&gt;allgood.click&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If this helps you ship faster, that's a win. Star the repo if you find it useful!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have questions? Drop them in the comments!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>saas</category>
      <category>node</category>
      <category>stripe</category>
      <category>opensource</category>
    </item>
    <item>
      <title>When Absurdity Meets Clean Code: allgood.click</title>
      <dc:creator>Martin Schenk</dc:creator>
      <pubDate>Fri, 14 Nov 2025 09:59:58 +0000</pubDate>
      <link>https://dev.to/martinschenk/when-absurdity-meets-clean-code-allgoodclick-49b5</link>
      <guid>https://dev.to/martinschenk/when-absurdity-meets-clean-code-allgoodclick-49b5</guid>
      <description>&lt;p&gt;Sometimes the best projects are the ones that solve absolutely nothing. I just built &lt;a href="https://allgood.click" rel="noopener noreferrer"&gt;allgood.click&lt;/a&gt; – a web app that promises to make everything okay. With one click. Spoiler: it does nothing. But that’s exactly the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Idea
&lt;/h2&gt;

&lt;p&gt;The concept is simple: A button. “Make everything OK”. Click it, and… well, everything’s okay. Or not. Whatever, you clicked and felt better for a second. Digital placebo effect as a service.&lt;/p&gt;

&lt;p&gt;Inspired by similar absurdist websites, I wanted to build something that comments on this culture of digital “solutions”. Every problem gets an app, every worry gets a button. But instead of giving it an ironic DIY look, my approach was: make it professional. The joke is in the serious execution of something completely pointless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack: Practical over fancy
&lt;/h2&gt;

&lt;p&gt;Node.js + Express for the backend. Why? Because I needed Stripe integration and didn’t feel like dealing with framework overhead. Laravel would’ve worked too, but for a project like this? Overkill.&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="c1"&gt;// Spoiler: The "make everything okay" algorithm&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/make-ok&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Highly complex logic here&lt;/span&gt;
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ok&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Everything is OK now&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The frontend is deliberately minimal. Full-height main screen, scrollable footer for the legal stuff. Responsive, because even absurd projects should work on mobile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monetization: Yes, seriously
&lt;/h2&gt;

&lt;p&gt;Here’s where it gets interesting: First click is free. After that, €1 per click or monthly subscription via Stripe. Sounds stupid? That’s the whole point.&lt;/p&gt;

&lt;p&gt;The Stripe integration was the technically educational part. Implemented both payment models:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One-time payments for the impulse clickers&lt;/li&gt;
&lt;li&gt;Subscriptions for those who need everything okay regularly
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Simplified&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;stripe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;checkout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;sessions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;payment_method_types&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;card&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;line_items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
    &lt;span class="na"&gt;price_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eur&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;product_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Make Everything OK&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
      &lt;span class="na"&gt;unit_amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// €1 in cents&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;quantity&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="p"&gt;}],&lt;/span&gt;
  &lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;payment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;success_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;YOUR_DOMAIN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/success`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;cancel_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;YOUR_DOMAIN&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/cancel`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Understatement works&lt;/strong&gt;&lt;br&gt;
“Make everything OK” instead of “REVOLUTIONIZE YOUR LIFE”. The deliberate understatement makes it funnier than any grand gesture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Professionalism amplifies absurdity&lt;/strong&gt;&lt;br&gt;
When something pointless is perfectly executed, it becomes more entertaining. Proper deployment pipeline, SSL via Cloudflare, clean error handling – all there.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Less text is more&lt;/strong&gt;&lt;br&gt;
Originally wanted to include philosophical texts. Scrapped it. “Still not okay? Click again.” is enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. i18n pays off even for jokes&lt;/strong&gt;&lt;br&gt;
Detect browser language, auto-switch to German/English/Spanish/French. Placebo effect is international.&lt;/p&gt;

&lt;h2&gt;
  
  
  Infrastructure
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Server: Own Plesk setup&lt;/li&gt;
&lt;li&gt;Domain: DonDominio&lt;/li&gt;
&lt;li&gt;DNS + SSL: Cloudflare&lt;/li&gt;
&lt;li&gt;Git: Private repo (because .env files and stuff)&lt;/li&gt;
&lt;li&gt;Deployment: Straight to server, no CI/CD circus needed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Legal Stuff (the unfunny part)
&lt;/h2&gt;

&lt;p&gt;Payment processing means: Imprint, Privacy Policy, Terms. Recycled content from my main site &lt;a href="https://martin-schenk.es" rel="noopener noreferrer"&gt;martin-schenk.es&lt;/a&gt; and adapted it. Stripe needs everything proper, even for joke projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Budget: One workday. Learning effect: Practical Stripe integration without tutorial nonsense. Fun factor: High, especially because it’s technically clean.&lt;/p&gt;

&lt;p&gt;Will anyone get rich with this? No. Is it a useful project? Absolutely not. But sometimes that’s exactly the point. Writing code that solves nothing but is well-made – there’s something to that.&lt;/p&gt;

&lt;p&gt;Try it out: &lt;a href="https://allgood.click" rel="noopener noreferrer"&gt;allgood.click&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First click is on the house. 😉&lt;/p&gt;




&lt;p&gt;&lt;em&gt;PS: The project is live. Payments work. Will anyone use it? We’ll see. It’s just an experiment anyway.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;What do you think about such absurdist tech projects? Have you ever built something just because you wanted to build it?​​​​​​​​​​​​​​​​&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>web</category>
      <category>tutorial</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building an AI Chat Terminal That Routes Private Data to Local AI</title>
      <dc:creator>Martin Schenk</dc:creator>
      <pubDate>Thu, 16 Oct 2025 18:56:08 +0000</pubDate>
      <link>https://dev.to/martinschenk/building-an-ai-chat-terminal-that-routes-private-data-to-local-ai-5g6a</link>
      <guid>https://dev.to/martinschenk/building-an-ai-chat-terminal-that-routes-private-data-to-local-ai-5g6a</guid>
      <description>&lt;p&gt;I was tired of accidentally pasting API keys into ChatGPT, so I built a terminal that intelligently routes conversations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every time you chat with ChatGPT, Claude, or any cloud AI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Everything goes to their servers&lt;/strong&gt; - passwords, API keys, emails, everything&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's all logged&lt;/strong&gt; - no way to delete it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You can't verify&lt;/strong&gt; what they do with your data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I kept cringing every time I accidentally pasted something sensitive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AI Chat Terminal&lt;/strong&gt; - keyword detection that runs BEFORE anything touches the network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;You: &lt;span class="s2"&gt;"save my password SecretPass123"&lt;/span&gt;
→ Routes to LOCAL Qwen AI ✅
→ Encrypted SQLite &lt;span class="o"&gt;(&lt;/span&gt;AES-256&lt;span class="o"&gt;)&lt;/span&gt; ✅
→ NEVER sent to cloud ✅

You: &lt;span class="s2"&gt;"What's the capital of Spain?"&lt;/span&gt;
→ Routes to OpenAI ✅

You: &lt;span class="s2"&gt;"best food there?"&lt;/span&gt;
→ OpenAI understands context &lt;span class="o"&gt;(&lt;/span&gt;Spain&lt;span class="o"&gt;)&lt;/span&gt; ✅
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Keyword Detection (&amp;lt;1ms)
&lt;/h3&gt;

&lt;p&gt;Pattern matching for &lt;code&gt;save&lt;/code&gt;, &lt;code&gt;show&lt;/code&gt;, &lt;code&gt;delete&lt;/code&gt; and 30+ synonyms:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;matches_keywords&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;save&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;note&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;record&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="nf"&gt;route_to_local&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;route_to_cloud&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Works in &lt;strong&gt;English, German, Spanish&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"save my email" → Local&lt;/li&gt;
&lt;li&gt;"guarda mi contraseña" → Local&lt;/li&gt;
&lt;li&gt;"speichere meine Telefonnummer" → Local&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Local AI Processing
&lt;/h3&gt;

&lt;p&gt;Uses &lt;strong&gt;Qwen 2.5 Coder (7B)&lt;/strong&gt; via Ollama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;User: &lt;span class="s2"&gt;"save my email test@example.com"&lt;/span&gt;
→ Qwen generates SQL:
  INSERT INTO mydata &lt;span class="o"&gt;(&lt;/span&gt;content, meta&lt;span class="o"&gt;)&lt;/span&gt;
  VALUES &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'test@example.com'&lt;/span&gt;, &lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
→ Encrypted with SQLCipher &lt;span class="o"&gt;(&lt;/span&gt;AES-256&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Cloud for Everything Else
&lt;/h3&gt;

&lt;p&gt;OpenAI GPT-4o with full context:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;You: &lt;span class="s2"&gt;"capital of France?"&lt;/span&gt;
AI: &lt;span class="s2"&gt;"Paris"&lt;/span&gt;

You: &lt;span class="s2"&gt;"best food there?"&lt;/span&gt;
AI: &lt;span class="s2"&gt;"Croissants..."&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;knows &lt;span class="s2"&gt;"there"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; Paris&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Python 3.9+&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; - Local AI runtime&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qwen 2.5 Coder (7B)&lt;/strong&gt; - SQL generation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SQLCipher&lt;/strong&gt; - AES-256 encryption&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenAI API&lt;/strong&gt; - Cloud queries&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~5GB&lt;/strong&gt; disk space for model&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation (macOS)
&lt;/h2&gt;

&lt;p&gt;One-line install:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/martinschenk/ai-chat-terminal/main/install.sh | zsh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This automatically:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Installs Ollama if needed&lt;/li&gt;
&lt;li&gt;Pulls Qwen 2.5 Coder model&lt;/li&gt;
&lt;li&gt;Sets up encrypted database&lt;/li&gt;
&lt;li&gt;Adds shell integration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Takes ~5 minutes (mostly downloading the 4.5GB model).&lt;/p&gt;

&lt;h2&gt;
  
  
  Usage Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Save Private Data
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;chat
👤 You ▶ save my email &lt;span class="nb"&gt;test&lt;/span&gt;@example.com
🤖 AI    🗄️ Stored 🔒

👤 You ▶ save password SecretPass123
🤖 AI    🗄️ Stored 🔒

👤 You ▶ guarda mi dirección Calle Mayor 1
🤖 AI    🗄️ Guardado 🔒
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Retrieve Anywhere
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;👤 You ▶ show my email
🤖 AI    🗄️🔍 &lt;span class="nb"&gt;test&lt;/span&gt;@example.com

👤 You ▶ list all
🤖 AI    🗄️🔍 Found 3 items:
           1. &lt;span class="nb"&gt;test&lt;/span&gt;@example.com &lt;span class="o"&gt;(&lt;/span&gt;email&lt;span class="o"&gt;)&lt;/span&gt;
           2. SecretPass123 &lt;span class="o"&gt;(&lt;/span&gt;password&lt;span class="o"&gt;)&lt;/span&gt;
           3. Calle Mayor 1 &lt;span class="o"&gt;(&lt;/span&gt;dirección&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  General Questions (Cloud)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;👤 You ▶ capital of Spain?
🤖 AI    Madrid.

👤 You ▶ best food?
🤖 AI    Tapas. &lt;span class="o"&gt;(&lt;/span&gt;remembers Spain!&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Privacy Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────┐
│ User Input                                  │
└────────────┬────────────────────────────────┘
             ↓
   ┌─────────────────────┐
   │ Keyword Detection   │  ← Fast (&amp;lt;1ms)
   │ save/show/delete    │
   └─────────┬───────────┘
             ↓
      ┌──────────────┐
      │  Detected?   │
      └──┬────────┬──┘
         │        │
    YES  │        │  NO
         ↓        ↓
  ┌──────────────┐  ┌──────────────┐
  │ Qwen 2.5     │  │   OpenAI     │
  │ Coder (7B)   │  │  GPT-4o      │
  │ SQL Direct   │  │  (Cloud)     │
  └─────┬────────┘  └──────┬───────┘
        ↓                   ↓
  ┌─────────────┐  ┌──────────────┐
  │ Encrypted   │  │  Response    │
  │ SQLite DB   │  │ with Context │
  │ (AES-256)   │  │              │
  └─────────────┘  └──────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔒 Privacy First
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keyword detection before any network call&lt;/li&gt;
&lt;li&gt;Local Qwen AI for sensitive data&lt;/li&gt;
&lt;li&gt;AES-256 encrypted SQLite&lt;/li&gt;
&lt;li&gt;Zero cloud exposure for private data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🧠 Smart Context
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;OpenAI maintains conversation history&lt;/li&gt;
&lt;li&gt;Understands references ("there", "it", "that")&lt;/li&gt;
&lt;li&gt;Natural follow-up questions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🌍 Multilingual
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;English, German, Spanish&lt;/li&gt;
&lt;li&gt;30+ action verbs per language&lt;/li&gt;
&lt;li&gt;Flexible phrasing&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ⚡ Fast
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Keyword matching: &amp;lt;1ms&lt;/li&gt;
&lt;li&gt;Local operations: &amp;lt;1s&lt;/li&gt;
&lt;li&gt;OpenAI queries: 5-7s&lt;/li&gt;
&lt;li&gt;Always shows 🗄️ icon for local DB operations&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  System Requirements
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;macOS 12.0+ (Monterey or later)&lt;/li&gt;
&lt;li&gt;Zsh shell&lt;/li&gt;
&lt;li&gt;Python 3.9+&lt;/li&gt;
&lt;li&gt;~5GB disk space (for Qwen model)&lt;/li&gt;
&lt;li&gt;8GB RAM minimum (16GB recommended)&lt;/li&gt;
&lt;li&gt;OpenAI API key&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Qwen 2.5 Coder?
&lt;/h2&gt;

&lt;p&gt;I tested several local models and Qwen 2.5 Coder was surprisingly good at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generating SQL from natural language&lt;/li&gt;
&lt;li&gt;Understanding multilingual input&lt;/li&gt;
&lt;li&gt;Pattern recognition for data extraction&lt;/li&gt;
&lt;li&gt;Running efficiently on 7B parameters&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Future Improvements
&lt;/h2&gt;

&lt;p&gt;Looking for contributors! Especially for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More languages&lt;/strong&gt; (French, Italian, Portuguese)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Windows/Linux ports&lt;/strong&gt; (currently macOS only)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Better error handling&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing on different macOS versions&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Open Source
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/martinschenk/ai-chat-terminal" rel="noopener noreferrer"&gt;https://github.com/martinschenk/ai-chat-terminal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; MIT&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contributions:&lt;/strong&gt; Welcome!&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This scratches an itch I had - wanting the power of GPT-4 without accidentally logging sensitive data. The keyword-based routing is simple but effective.&lt;/p&gt;

&lt;p&gt;Would love feedback on the privacy model - I'm sure there are edge cases I haven't considered!&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Repo: &lt;a href="https://github.com/martinschenk/ai-chat-terminal" rel="noopener noreferrer"&gt;https://github.com/martinschenk/ai-chat-terminal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hacker News Discussion: &lt;a href="https://news.ycombinator.com/submitted?id=ma8nk" rel="noopener noreferrer"&gt;https://news.ycombinator.com/submitted?id=ma8nk&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>privacy</category>
      <category>opensource</category>
      <category>terminal</category>
    </item>
    <item>
      <title>✅ Laravel Cookie Consent – Plug &amp; play GDPR/DSGVO modal</title>
      <dc:creator>Martin Schenk</dc:creator>
      <pubDate>Fri, 30 May 2025 07:38:32 +0000</pubDate>
      <link>https://dev.to/martinschenk/my-new-laravel-cookie-consent-plugin-j1a</link>
      <guid>https://dev.to/martinschenk/my-new-laravel-cookie-consent-plugin-j1a</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuo1cxe1x459zb383llvz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuo1cxe1x459zb383llvz.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hey folks! 👋&lt;br&gt;
I just released a lightweight, developer-friendly cookie consent plugin for Laravel 11+ projects. It’s focused on real GDPR/DSGVO compliance – with a configurable modal, full Alpine.js support, language preferences, and real-time cookie blocking.&lt;/p&gt;

&lt;p&gt;🔹 Easy to install&lt;br&gt;
🔹 No frontend lock-in (customizable view &amp;amp; JS logic)&lt;br&gt;
🔹 Works with Tailwind or plain CSS&lt;br&gt;
🔹 Built for modern Laravel stacks&lt;/p&gt;

&lt;p&gt;Check it out here:&lt;br&gt;
👉 &lt;a href="https://github.com/martinschenk/laravel-cookie-consent" rel="noopener noreferrer"&gt;https://github.com/martinschenk/laravel-cookie-consent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback, stars ⭐️ and contributions are very welcome! 🙏&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>opensource</category>
      <category>plugin</category>
    </item>
    <item>
      <title>Laravel 11/12 Cookie consent Plugin GDPR compliant 🇪🇺</title>
      <dc:creator>Martin Schenk</dc:creator>
      <pubDate>Fri, 30 May 2025 07:27:46 +0000</pubDate>
      <link>https://dev.to/martinschenk/laravel-1112-cookie-consent-plugin-dgpr-compliant-1o2d</link>
      <guid>https://dev.to/martinschenk/laravel-1112-cookie-consent-plugin-dgpr-compliant-1o2d</guid>
      <description>&lt;p&gt;✅ Laravel Cookie Consent – Plug &amp;amp; play GDPR/DSGVO modal&lt;/p&gt;

&lt;p&gt;Body:&lt;br&gt;
Hey folks! 👋&lt;br&gt;
I just released a lightweight, developer-friendly cookie consent plugin for Laravel 11+ projects. It’s focused on real GDPR/DSGVO compliance – with a configurable modal, full Alpine.js support, language preferences, and real-time cookie blocking.&lt;/p&gt;

&lt;p&gt;🔹 Easy to install&lt;br&gt;
🔹 No frontend lock-in (customizable view &amp;amp; JS logic)&lt;br&gt;
🔹 Works with Tailwind or plain CSS&lt;br&gt;
🔹 Built for modern Laravel stacks&lt;/p&gt;

&lt;p&gt;Check it out here:&lt;br&gt;
👉 &lt;a href="https://github.com/martinschenk/laravel-cookie-consent" rel="noopener noreferrer"&gt;https://github.com/martinschenk/laravel-cookie-consent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback, stars ⭐️ and contributions are very welcome! 🙏&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>opensource</category>
      <category>security</category>
    </item>
  </channel>
</rss>
