<?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 (@falk_maria_zeitsprung).</description>
    <link>https://dev.to/falk_maria_zeitsprung</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F271233%2F87ac2e16-be94-4a73-9590-26ee41020bbf.jpg</url>
      <title>DEV Community: Martin Schenk</title>
      <link>https://dev.to/falk_maria_zeitsprung</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/falk_maria_zeitsprung"/>
    <language>en</language>
    <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/falk_maria_zeitsprung/my-weekend-project-for-christmas-time-httpsyoutubecomshortsdkbqku-jq4osirvpoi2ykwydprok2-2do8</link>
      <guid>https://dev.to/falk_maria_zeitsprung/my-weekend-project-for-christmas-time-httpsyoutubecomshortsdkbqku-jq4osirvpoi2ykwydprok2-2do8</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&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/falk_maria_zeitsprung/how-i-built-a-production-ready-saas-in-a-weekend-and-open-sourced-it-2f66</link>
      <guid>https://dev.to/falk_maria_zeitsprung/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/falk_maria_zeitsprung/when-absurdity-meets-clean-code-allgoodclick-49b5</link>
      <guid>https://dev.to/falk_maria_zeitsprung/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/falk_maria_zeitsprung/building-an-ai-chat-terminal-that-routes-private-data-to-local-ai-5g6a</link>
      <guid>https://dev.to/falk_maria_zeitsprung/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/falk_maria_zeitsprung/my-new-laravel-cookie-consent-plugin-j1a</link>
      <guid>https://dev.to/falk_maria_zeitsprung/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/falk_maria_zeitsprung/laravel-1112-cookie-consent-plugin-dgpr-compliant-1o2d</link>
      <guid>https://dev.to/falk_maria_zeitsprung/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>
