<?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: Shuttlewright</title>
    <description>The latest articles on DEV Community by Shuttlewright (@shuttlewright).</description>
    <link>https://dev.to/shuttlewright</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%2F4190344%2F93fa45bb-51c9-4981-b2f0-106d534f54c2.png</url>
      <title>DEV Community: Shuttlewright</title>
      <link>https://dev.to/shuttlewright</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shuttlewright"/>
    <language>en</language>
    <item>
      <title>Your tools shouldn't be able to fire you</title>
      <dc:creator>Shuttlewright</dc:creator>
      <pubDate>Sat, 24 Oct 2026 21:06:13 +0000</pubDate>
      <link>https://dev.to/shuttlewright/your-tools-shouldnt-be-able-to-fire-you-5h6m</link>
      <guid>https://dev.to/shuttlewright/your-tools-shouldnt-be-able-to-fire-you-5h6m</guid>
      <description>&lt;p&gt;A post made the rounds on X this week.&lt;/p&gt;

&lt;p&gt;A developer says OpenAI shut down his account. His story: he was running a log4j decompiler on his own machine, for his own work. The deactivation email called it "Cyber Abuse".&lt;/p&gt;

&lt;p&gt;We can't verify his story. Take it as his account, not established fact.&lt;/p&gt;

&lt;p&gt;But watch the reaction. Developers believed it instantly. That reaction is the real news: people already expect their AI tools to turn on them.&lt;/p&gt;

&lt;h2&gt;
  
  
  You're renting your job
&lt;/h2&gt;

&lt;p&gt;Check the paperwork. OpenAI's &lt;a href="https://openai.com/policies/terms-of-use/" rel="noopener noreferrer"&gt;Terms of Use&lt;/a&gt; say they "reserve the right to suspend or terminate your access" if they decide you breached their usage policies. Anthropic's &lt;a href="https://www.anthropic.com/legal/consumer-terms" rel="noopener noreferrer"&gt;consumer terms&lt;/a&gt; say the same, and its &lt;a href="https://www.anthropic.com/legal/aup" rel="noopener noreferrer"&gt;usage policy&lt;/a&gt; adds that a Safeguards Team runs "detection and monitoring" to enforce it.&lt;/p&gt;

&lt;p&gt;That's their right. It's their service.&lt;/p&gt;

&lt;p&gt;But look at the shape of the deal. An automated system flags you. A form letter goes out. Your tools stop working. Your workflow, your prompts, your history... gone.&lt;/p&gt;

&lt;p&gt;If one false flag can kill your whole stack, you never owned the stack. You were renting it. And the landlord doesn't pick up the phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The answer spreading right now: own your intelligence
&lt;/h2&gt;

&lt;p&gt;Read the replies under that post. They all say the same thing.&lt;/p&gt;

&lt;p&gt;Local models. Own clusters. Own weights.&lt;/p&gt;

&lt;p&gt;One reply, next to a photo of his own hardware: "owning my intelligence".&lt;/p&gt;

&lt;p&gt;The tools got good enough for this to be practical. Open-weight models run well on hardware that fits on a desk. No usage policy in the loop. No account to suspend. The model can't be taken back, because it's already yours.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your data has the same problem
&lt;/h2&gt;

&lt;p&gt;It's not only the model. It's what you hand over every day.&lt;/p&gt;

&lt;p&gt;Paste a customer email into a cloud tool to "summarize this". Paste a support thread. Paste a contract. That text leaves your machine and lands somewhere you don't control, under terms you didn't read.&lt;/p&gt;

&lt;p&gt;Most teams fix this with policy documents. Policies are nice. Software is better.&lt;/p&gt;

&lt;p&gt;So we built a small thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mask: strip the personal data before it leaves your machine
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://shuttlewright-mask.pillar-3a8.workers.dev/" rel="noopener noreferrer"&gt;Mask&lt;/a&gt; finds names, emails, phone numbers and addresses in text and replaces them with safe placeholders. Before you paste anything into any AI tool.&lt;/p&gt;

&lt;p&gt;Everything runs in your browser. No uploads. No accounts. No tracking. We never see your text, because it never leaves your machine. That's not a policy promise. It's how the software works.&lt;/p&gt;

&lt;p&gt;We tested it on 15 synthetic business texts seeded with known personal details. It flagged all 36 out of 36. That's a synthetic test, not a promise about your text, and we're telling you exactly how it was measured.&lt;/p&gt;

&lt;p&gt;It's free. If you need unlimited use and a pre-send relay, that's $9 a month.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we're doing next
&lt;/h2&gt;

&lt;p&gt;Keeping the redaction local. That part is not negotiable.&lt;/p&gt;

&lt;p&gt;Adding more entity types, and reading the terms of the tools we all use, so we can keep writing pieces like this one.&lt;/p&gt;

&lt;p&gt;The devs in those replies are right. Own your intelligence. Start with the part you can fix today: stop handing strangers your raw data.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shuttlewright-mask.pillar-3a8.workers.dev/" rel="noopener noreferrer"&gt;Try Mask free&lt;/a&gt;... takes about ten seconds, and your text never leaves your browser.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>privacy</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Check if the LiteLLM 1.107.0 compromise hit you in 30 seconds</title>
      <dc:creator>Shuttlewright</dc:creator>
      <pubDate>Thu, 22 Oct 2026 08:16:19 +0000</pubDate>
      <link>https://dev.to/shuttlewright/check-if-the-litellm-11070-compromise-hit-you-in-30-seconds-310e</link>
      <guid>https://dev.to/shuttlewright/check-if-the-litellm-11070-compromise-hit-you-in-30-seconds-310e</guid>
      <description>&lt;p&gt;On October 21, the litellm 1.107.0 release on PyPI shipped a credential stealer and a remote-code backdoor. PyPI pulled the release the same day. Only 1.107.0 is compromised: 1.106.2 and the 1.107.0 rc builds are clean.&lt;/p&gt;

&lt;p&gt;Here is how to check whether it touched your machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Check the version
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip freeze | &lt;span class="nb"&gt;grep &lt;/span&gt;litellm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If nothing pins 1.107.0, the package did not install the implant on that machine. Do not stop here if you ran 1.107.0 at any point yesterday.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Check the host, not just the package
&lt;/h2&gt;

&lt;p&gt;The implant drops files into site-packages (&lt;code&gt;cook.pth&lt;/code&gt;, &lt;code&gt;cook.py&lt;/code&gt;, &lt;code&gt;sitecustomize.py&lt;/code&gt;) and runs with every Python process on the host, even one that never imports litellm. Upgrading or uninstalling the package does not remove them.&lt;/p&gt;

&lt;p&gt;Look for those files in site-packages, and for these marker files:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/tmp/.pc_once_72129118c59f5636c0bb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/tmp/remote_code_loader.lock&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Check CI runners and build containers, not just laptops. CI usually holds the more dangerous credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. If you find anything, rotate in spend order
&lt;/h2&gt;

&lt;p&gt;The stealer targeted SSH keys, cloud credentials, CI/CD secrets, AI tool tokens, browser passwords and LLM provider keys. Rotate in this order:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cloud and package-publish credentials&lt;/li&gt;
&lt;li&gt;LLM provider keys&lt;/li&gt;
&lt;li&gt;Read-only tokens&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then review the last 72 hours of spend dashboards.&lt;/p&gt;

&lt;h2&gt;
  
  
  A free checker
&lt;/h2&gt;

&lt;p&gt;We built a browser-only checklist that walks through all of this: version analysis plus the exact host-file checks. Nothing you paste leaves the browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shuttlewright-litellm-check.pillar-3a8.workers.dev/" rel="noopener noreferrer"&gt;LiteLLM 1.107.0 exposure check&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sources: &lt;a href="https://safedep.io/litellm-pypi-compromise-credential-stealer-backdoor/" rel="noopener noreferrer"&gt;SafeDep's writeup&lt;/a&gt; and the &lt;a href="https://docs.litellm.ai/blog/security-incident-oct-21-2026" rel="noopener noreferrer"&gt;official LiteLLM incident note&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>security</category>
      <category>python</category>
      <category>supplychain</category>
      <category>devops</category>
    </item>
    <item>
      <title>The EU banned 'eco-friendly' on 27 September - check your landing page</title>
      <dc:creator>Shuttlewright</dc:creator>
      <pubDate>Sun, 18 Oct 2026 07:59:48 +0000</pubDate>
      <link>https://dev.to/shuttlewright/the-eu-banned-eco-friendly-on-27-september-check-your-landing-page-3855</link>
      <guid>https://dev.to/shuttlewright/the-eu-banned-eco-friendly-on-27-september-check-your-landing-page-3855</guid>
      <description>&lt;p&gt;Since 27 September 2026, the EU's Empowering Consumers Directive bans generic environmental claims across the EU - no grace period:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Eco-friendly", "green", "climate neutral", "sustainable"&lt;/strong&gt; and similar generic terms are blacklisted unless you can prove recognised excellent environmental performance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claims based on carbon offsetting&lt;/strong&gt; ("CO2 neutral product") are banned outright.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Self-made eco labels and badges&lt;/strong&gt; are banned unless they come from an approved certification scheme.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you sell to EU customers, your landing page, checkout, packaging and ads all count. Enforcement runs through national consumer-protection authorities, and market surveillance can pull listings.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 20-minute sweep
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Search your site, emails, ads and packaging&lt;/strong&gt; for every green word and badge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;For each claim:&lt;/strong&gt; can you prove it with recognised certification or top-tier performance data? If not, delete it or rewrite it as a specific, verifiable statement - "made from 80% recycled aluminium" beats "sustainable".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remove offsetting-based product claims entirely&lt;/strong&gt; - they cannot be fixed by wording.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screenshot what you changed and when&lt;/strong&gt;, so you can show good faith if asked.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Run your homepage through the free claim checker - it flags the exact words market surveillance looks for, in about a minute: &lt;a href="https://shuttlewright-gc-pack.pillar-3a8.workers.dev/" rel="noopener noreferrer"&gt;https://shuttlewright-gc-pack.pillar-3a8.workers.dev/&lt;/a&gt; If the list is longer than you expected, the $29 pack has the claim-by-claim rewrite table and the evidence file to show good faith.&lt;/p&gt;

&lt;p&gt;Templates, not legal advice.&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>marketing</category>
    </item>
    <item>
      <title>EU AI Act: your chatbot has to say it is AI - and 2 December ends the marking grace period</title>
      <dc:creator>Shuttlewright</dc:creator>
      <pubDate>Sun, 18 Oct 2026 02:57:30 +0000</pubDate>
      <link>https://dev.to/shuttlewright/eu-ai-act-your-chatbot-has-to-say-it-is-ai-and-2-december-ends-the-marking-grace-period-14p7</link>
      <guid>https://dev.to/shuttlewright/eu-ai-act-your-chatbot-has-to-say-it-is-ai-and-2-december-ends-the-marking-grace-period-14p7</guid>
      <description>&lt;p&gt;Since 2 August 2026, Article 50 of the EU AI Act applies to any product that interacts with EU users:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chatbots must disclose they are AI&lt;/strong&gt; - before or during the first interaction.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI-generated text, image, audio and video must carry a machine-readable mark.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deepfakes need a visible disclosure label.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your system was on the market before 2 August, the grace period for the marking duty ends &lt;strong&gt;2 December 2026&lt;/strong&gt;. Fines run up to 3% of global turnover.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is in scope
&lt;/h2&gt;

&lt;p&gt;SaaS founders shipping chat features, AI content tools, onboarding bots, support agents - anything an EU user might interact with. "We have no EU office" does not exempt you: the Act follows the users, not your HQ.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Map every AI feature&lt;/strong&gt; that interacts with users (chat, content generation, voice, avatars).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add disclosure copy at the right point&lt;/strong&gt; - first interaction for chatbots, visible labels for deepfakes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mark generated content machine-readably&lt;/strong&gt; (metadata or watermark; the technical standard is still being finalised, so document your interim approach).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep records of what is disclosed where&lt;/strong&gt; - regulators ask for evidence, not intentions.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Six weeks is short if your disclosure copy, marking approach and evidence records are not started. Run the free obligation checker - two minutes, and it tells you which Article 50 duties touch your product: &lt;a href="https://shuttlewright-ai-transparency-pack.pillar-3a8.workers.dev/" rel="noopener noreferrer"&gt;https://shuttlewright-ai-transparency-pack.pillar-3a8.workers.dev/&lt;/a&gt; If more than one duty lands, the $29 pack has the obligation map, disclosure wording you can adapt, and the marking checklist.&lt;/p&gt;

&lt;p&gt;Templates, not legal advice.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>saas</category>
    </item>
    <item>
      <title>Stop pasting client data into AI chats: a redaction step that runs entirely in your browser</title>
      <dc:creator>Shuttlewright</dc:creator>
      <pubDate>Sat, 17 Oct 2026 11:13:03 +0000</pubDate>
      <link>https://dev.to/shuttlewright/stop-pasting-client-data-into-ai-chats-a-redaction-step-that-runs-entirely-in-your-browser-2ncc</link>
      <guid>https://dev.to/shuttlewright/stop-pasting-client-data-into-ai-chats-a-redaction-step-that-runs-entirely-in-your-browser-2ncc</guid>
      <description>&lt;p&gt;Every day, developers and consultants paste real client data into AI chatbots. Names, emails, phone numbers, card numbers, amounts. The model gets a copy. So do its logs.&lt;/p&gt;

&lt;p&gt;We built Shuttlewright Mask to break that habit without breaking the workflow. It runs entirely in your browser tab: paste text in, sensitive values become tokens, send the masked text to any AI, paste the answer back, and the real values are restored.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Paste a message like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Hi, my name is Kwame Mensah. Please remind our client Abena Osei (&lt;a href="mailto:abena.osei@example.com"&gt;abena.osei@example.com&lt;/a&gt;, 024 555 0134) that her invoice of GHS 4,250 is due Friday. Card on file: 4242 4242 4242 4242.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mask returns:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Masked: Hi, my name is [PERSON_1]. Please remind our client [PERSON_2] &lt;a href="https://dev.to[EMAIL_1],%20[PHONE_1]"&gt;PERSON_3&lt;/a&gt; that her invoice of [AMOUNT_1] is due Friday. Card on file: [CARD_1]. 7 sensitive values replaced.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The token map - which token means which real value - never leaves your browser tab. Only the masked text goes to the AI. Paste the reply back and Mask restores the real values, so your client-facing text reads normally.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it detects
&lt;/h2&gt;

&lt;p&gt;Names, email addresses, phone numbers, card numbers, account numbers, postal addresses, and currency amounts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part
&lt;/h2&gt;

&lt;p&gt;Our engine caught 26 of 26 seeded values (100%) across 12 synthetic business texts - on our own published test set. Your text is not our test set. No detector catches everything, and masked text can still carry identifying meaning (a rare job title plus a city can identify a person). That is why Mask shows you the masked version before anything is sent: you are the last check.&lt;/p&gt;

&lt;p&gt;Privacy tooling that oversells is just marketing. The self-test runs on the site, unedited, so you can check it yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free and Pro
&lt;/h2&gt;

&lt;p&gt;Free: the full mask-ask-restore loop in your browser, no account.&lt;br&gt;
Pro ($9/month): removes the length limit and adds a relay that double-checks for leaks before anything is sent.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://shuttlewright-mask.pillar-3a8.workers.dev/" rel="noopener noreferrer"&gt;https://shuttlewright-mask.pillar-3a8.workers.dev/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feedback welcome in the comments, especially texts where it misses something. That is how the detector gets better.&lt;/p&gt;

</description>
      <category>privacy</category>
      <category>webdev</category>
      <category>security</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
