<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>GitHub on KnightLi Blog</title>
        <link>https://www.knightli.com/en/tags/github/</link>
        <description>Recent content in GitHub on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Sat, 16 May 2026 16:26:50 +0800</lastBuildDate><atom:link href="https://www.knightli.com/en/tags/github/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Do Not Push API Keys to GitHub: A Secret-Leak Prevention Guide for AI Coding</title>
        <link>https://www.knightli.com/en/2026/05/16/ai-coding-api-key-leak-github/</link>
        <pubDate>Sat, 16 May 2026 16:26:50 +0800</pubDate>
        
        <guid>https://www.knightli.com/en/2026/05/16/ai-coding-api-key-leak-github/</guid>
        <description>&lt;p&gt;AI coding lowers the barrier to building software, but it also brings many engineering security problems to beginners and non-engineering users.&lt;/p&gt;
&lt;p&gt;One of the most common incidents is pushing &lt;code&gt;API Key&lt;/code&gt;, &lt;code&gt;Secret&lt;/code&gt;, &lt;code&gt;Token&lt;/code&gt;, database connection strings, or &lt;code&gt;.env&lt;/code&gt; files to a public repository. Locally, these files may look like ordinary configuration that keeps the app running. Once they enter a public GitHub repository, they become credentials that can be scanned, called, and abused automatically.&lt;/p&gt;
&lt;p&gt;Secret leaks are not rare. GitGuardian&amp;rsquo;s 2026 report says public GitHub commits in 2025 contained about 28.65 million new hardcoded credentials, and AI-service credential leaks grew 81% year over year. The issue is no longer just carelessness. AI coding, rapid prototyping, and public hosting are amplifying the scale.&lt;/p&gt;
&lt;h2 id=&#34;why-beginners-leak-keys-more-easily&#34;&gt;Why Beginners Leak Keys More Easily
&lt;/h2&gt;&lt;p&gt;Many AI agents and small tools have two &amp;ldquo;repositories&amp;rdquo;: one on the local disk, and one visible to the world on GitHub. The problem is that beginners often do not understand the boundary between the two.&lt;/p&gt;
&lt;p&gt;During local development, &lt;code&gt;config.json&lt;/code&gt;, &lt;code&gt;.env&lt;/code&gt;, and &lt;code&gt;settings.yaml&lt;/code&gt; may contain API keys. After &lt;code&gt;git add .&lt;/code&gt;, &lt;code&gt;git commit&lt;/code&gt;, and &lt;code&gt;git push&lt;/code&gt;, those files may be uploaded in full. Once a repository is public, scanning bots do not need to understand your business logic. They only need to match a secret pattern.&lt;/p&gt;
&lt;p&gt;AI coding makes this worse:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;AI-generated examples may place &lt;code&gt;OPENAI_API_KEY = &amp;quot;sk-...&amp;quot;&lt;/code&gt; directly in source code.&lt;/li&gt;
&lt;li&gt;Beginners often hardcode secrets in frontend code, scripts, or config files just to get the project running.&lt;/li&gt;
&lt;li&gt;Many vibe coding platforms can deploy apps directly without going through GitHub push protection.&lt;/li&gt;
&lt;li&gt;Users may not know which files, APIs, or default permissions exist inside an AI-generated project.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In short, AI can help you build something that runs faster. It does not automatically take over the security responsibility.&lt;/p&gt;
&lt;h2 id=&#34;gitignore-is-not-decoration&#34;&gt;&lt;code&gt;.gitignore&lt;/code&gt; Is Not Decoration
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Git&lt;/code&gt; manages version history, &lt;code&gt;GitHub&lt;/code&gt; hosts code, and &lt;code&gt;.gitignore&lt;/code&gt; tells Git which files should not enter that history.&lt;/p&gt;
&lt;p&gt;A basic AI project should at least ignore these:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.env
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.env.*
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*.key
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;*.pem
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;config.local.*
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;secrets.*
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;credentials.*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;But &lt;code&gt;.gitignore&lt;/code&gt; alone is not enough. It only prevents untracked files from being added later. If a secret file has already been committed, adding it to &lt;code&gt;.gitignore&lt;/code&gt; will not remove it from history.&lt;/p&gt;
&lt;p&gt;A safer habit is:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create &lt;code&gt;.gitignore&lt;/code&gt; at the beginning of a project.&lt;/li&gt;
&lt;li&gt;Store API keys only in environment variables or local config.&lt;/li&gt;
&lt;li&gt;Provide &lt;code&gt;.env.example&lt;/code&gt; with placeholders, not real secrets.&lt;/li&gt;
&lt;li&gt;Run a secret scanner before committing, such as &lt;code&gt;gitleaks&lt;/code&gt;, &lt;code&gt;trufflehog&lt;/code&gt;, or GitHub Secret Scanning.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;deleting-the-file-is-not-enough&#34;&gt;Deleting the File Is Not Enough
&lt;/h2&gt;&lt;p&gt;If a key has already been pushed to a public repository, the first reaction should not be &amp;ldquo;delete the file and commit again.&amp;rdquo; Revoke or rotate the key first.&lt;/p&gt;
&lt;p&gt;Git records history. Even if the latest commit removes the file, old commits, forks, clones, caches, and scanners may still contain it. GitHub&amp;rsquo;s documentation also recommends revoking or rotating passwords, tokens, and credentials as the first step.&lt;/p&gt;
&lt;p&gt;Recommended order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Revoke the old key in the provider console and create a new one.&lt;/li&gt;
&lt;li&gt;Check billing, usage logs, suspicious IPs, and unusual traffic.&lt;/li&gt;
&lt;li&gt;Remove hardcoded secrets and switch to environment variables or a secret manager.&lt;/li&gt;
&lt;li&gt;Clean sensitive files from repository history with &lt;code&gt;git filter-repo&lt;/code&gt; or BFG.&lt;/li&gt;
&lt;li&gt;Enable GitHub Secret Scanning and Push Protection.&lt;/li&gt;
&lt;li&gt;Check CI/CD, deployment platforms, cloud functions, and frontend build artifacts for the old key.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For OpenAI, Anthropic, DeepSeek, cloud providers, payment services, email services, and databases, a leaked key can lead to more than unexpected bills. It may expose data, enable abuse, affect the supply chain, or get business accounts banned.&lt;/p&gt;
&lt;h2 id=&#34;real-secrets-do-not-belong-in-frontend-code&#34;&gt;Real Secrets Do Not Belong in Frontend Code
&lt;/h2&gt;&lt;p&gt;Many beginners put API keys into frontend JavaScript because the page works:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;apiKey&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;sk-xxxxxxxx&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is effectively public. Browser code, network requests, source maps, and build artifacts can all be inspected. Any key that must remain secret should not appear on the client side.&lt;/p&gt;
&lt;p&gt;The correct approach is to let the frontend call your own backend, and let the backend read environment variables and call the third-party API:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// frontend
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/api/chat&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;POST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;JSON&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;stringify&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Then the server uses the environment variable:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// server
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;apiKey&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;env&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This keeps the secret in the server environment instead of exposing it to every visitor.&lt;/p&gt;
&lt;h2 id=&#34;vibe-coding-does-not-remove-security-responsibility&#34;&gt;Vibe Coding Does Not Remove Security Responsibility
&lt;/h2&gt;&lt;p&gt;Vibe coding is not only a GitHub leak problem. Many apps are published directly from AI coding platforms to the public internet, bypassing traditional code review, repository scanning, and security testing.&lt;/p&gt;
&lt;p&gt;Recent RedAccess research found a large number of publicly accessible assets generated or hosted by AI coding tools, some exposing corporate data, personal information, or internal files. The lesson is simple: when &amp;ldquo;can deploy&amp;rdquo; becomes too easy, people often forget to ask &amp;ldquo;should this be public?&amp;rdquo;, &amp;ldquo;should this only be internal?&amp;rdquo;, and &amp;ldquo;does it have access control?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Before publishing an AI-generated app, ask:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Does this app really need public access?&lt;/li&gt;
&lt;li&gt;Does it have login, authentication, and permission isolation?&lt;/li&gt;
&lt;li&gt;Are database URLs, API keys, tokens, or webhook URLs exposed in frontend code?&lt;/li&gt;
&lt;li&gt;Are third-party API quota, domain, permission, and expiry limits configured?&lt;/li&gt;
&lt;li&gt;Can keys be disabled and deployments rolled back quickly after an incident?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;AI-generated code still needs security review. The less code you personally wrote, the less you should assume it is safe.&lt;/p&gt;
&lt;h2 id=&#34;checks-to-run-now&#34;&gt;Checks to Run Now
&lt;/h2&gt;&lt;p&gt;Start with your own GitHub account. Search your username together with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SECRET
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TOKEN
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OPENAI_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ANTHROPIC_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DEEPSEEK_API_KEY
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;.env
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;config
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;credentials
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If you find a real key, rotate first and clean up later. If it ever entered a public repository, treat it as leaked.&lt;/p&gt;
&lt;p&gt;For future AI projects, use a fixed process:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Write &lt;code&gt;.gitignore&lt;/code&gt; before writing business code.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;.env.example&lt;/code&gt; to document required variables.&lt;/li&gt;
&lt;li&gt;Put all secrets in environment variables, not source code.&lt;/li&gt;
&lt;li&gt;Give API keys minimal permissions, quotas, and expiry dates.&lt;/li&gt;
&lt;li&gt;Enable GitHub Secret Scanning and Push Protection.&lt;/li&gt;
&lt;li&gt;Let AI help with a security review before publishing, but do not trust AI alone.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The danger of AI coding is not simply that it may write bad code. It gives many people the ability to publish unsafe apps to the public internet for the first time. Writing fast is not the problem. Handing out secrets, data, and permissions is.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.gitguardian.com/state-of-secrets-sprawl-report-2026&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitGuardian State of Secrets Sprawl 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.github.com/articles/remove-sensitive-data&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub Docs: Removing sensitive data from a repository&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.github.com/code-security/secret-scanning/push-protection-for-repositories-and-organizations&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;GitHub Docs: About push protection&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.axios.com/2026/05/07/loveable-replit-vibe-coding-privacy&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Axios: AI vibe-coding apps leak sensitive data&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
