AI multiplies bad engineering too
When AI-generated code breaks something, the real problem is often how we reviewed, understood, and trusted it.
Personal blog by eshlox. Writing about software development, privacy, tools, and tech.
When AI-generated code breaks something, the real problem is often how we reviewed, understood, and trusted it.
AI turned changing my blog layout from a yearly event into six redesigns in one evening.
AI agents do almost all the work, while I control permissions, review every change, and decide what gets merged.
Every AI apology should refund the tokens it just used.
I let AI build a full side project in one run. It ran, but every screen had bugs and I do not know the code. Now I think small tasks, real reviews, and my own merge decision are still the way to work.
I write a Flutter app in a container on a Hetzner box and build it on my Mac. Mutagen copies each change to the Mac over SSH, not Docker.
I moved all my development off my MacBook and onto an always-on Hetzner VPS, reached over Tailscale. The laptop is now a thin client running only Ghostty, Tailscale, Secretive, and a few small tools. Everything else runs in the cloud, one container per project.
Ask AI to expand a tiny side project and it may build an entire enterprise platform.
The Anthropic case reminded me that vendor lock-in is not just a technical problem. A service can also be affected by the government and laws of the country where the company operates. For critical projects, you need an exit plan.
I use AI every day, but I am not convinced that giving it access to every part of our lives is safe.
Why I wrote a small Bash wrapper around Lima to give each project its own Fedora VM, with VM-local SSH keys, an AI agent sandbox, and no host mounts by default.
A small zsh function on top of just that renames tmux windows, falls back to a global justfile, and shows project + global recipes in one fuzzy picker.
Subscribe to Google Calendar's secret iCal feed from any calendar app. Keep your Google account out of macOS and iOS. Worked example for Apple Calendar on Mac, iPhone, and iPad.
Developers went from distrusting everyone to handing AI agents access to everything.
A small LaunchAgent that runs hidutil at boot. Native Caps Lock remap on macOS, no app needed.
Mobile and desktop stores should support PWAs as first-class applications.
There are developers who sandbox everything and developers who will after their first incident.
Posting on multiple social networks is tiring. Here's what I use, what I like about each, and why I haven't found a good answer.
When you host on a big cloud, you inherit every employee, every OAuth connector, and every co-tenant as part of your attack surface. The Vercel breach is a good example of why.
While developer tools move from terminals to GUIs and give AI access to everything, I am moving in the opposite direction.
The more software I install, the bigger the chance that I run something unsafe. One mistake, and everything the app can access is at risk.
I discovered Polish folk music on YouTube that I genuinely enjoyed. Then I found out it was AI-generated, and I stopped listening. I'm still not sure why.
Using just recipes to rename tmux windows based on the running task, then restore the name when the command exits.
A Hammerspoon hotkey that saves clipboard images to the current tmux pane directory. Workaround for AI sandboxes that do not support image pasting.
Claude Desktop adds MCP servers, Cowork, Computer Use, and Desktop Extensions. Every one of them is an extra attack surface I don't need.
A hardening checklist and decision matrix for secure local development with Infisical, Docker, and AI sandboxes. Quick reference for what goes where.
Onboarding, offboarding, RBAC, CI/CD machine identities. What changes when the solo workflow becomes a team workflow.
Practical day-to-day workflows for developing with Infisical, Docker, and AI sandboxes. Morning startup, coding with AI, adding and rotating secrets, multi-project setup.
Comparing secrets managers for local development: HashiCorp Vault, OpenBao, Doppler, SOPS + age, and Infisical. Plus why no secrets manager can save a compromised machine.
Keep Apple for personal, Linux for development. Physical separation solves what software isolation cannot.
Helix, lazygit, and other CLI tools can be sandboxed with nono or zerobox. GUI apps like Docker Desktop cannot. Here is what you can do.
Rotate first, investigate second. Every minute the old secret is valid is a minute an attacker can use it.
Set up infisical scan as a pre-commit hook. AI-generated code with hardcoded credentials is especially risky.
Three ways to let Claude test endpoints without seeing secrets: exposed ports, shared Docker network, or an MCP proxy.
In the AI sandbox, compromised packages only see source code. In the dev stack, use multi-stage Docker builds to keep secrets away from install scripts.
Every AI agent isolation option compared. sbx for maximum security, zerobox for ease of use, nono for irrevocable kernel restrictions.
Claude's trust levels, allowed actions, and permission popups are self-enforced and bypassable. Use infrastructure isolation instead.
Expo cannot run in Docker because iOS Simulator needs direct Metro access. This is fine because Expo only uses public variables.
Run your API and database in Docker Compose, inject secrets with Infisical, run AI agents in a separate sandbox with only source code.
Claude Code auto-loads .env files. Cursor bypasses .cursorignore. There are real CVEs. The only fix is separate execution contexts.
Install Infisical CLI, organize secrets by project and environment, inject them into processes without writing to disk.
1Password is great for personal passwords but bad for dev secrets. No project structure, biometric fatigue, opaque popups, all-or-nothing access.
AI coding agents read your .env files and send secrets to remote servers. Here is how I rebuilt my local dev workflow to fix this.
A quick guide to running Claude Code in a Docker sandbox using sbx. No permission prompts, isolated environment.
A minimal Ghostty terminal config for macOS. No titlebar, auto tmux, Catppuccin theme, and a few quality of life tweaks.
A single justfile for commands you need everywhere, not just in a project.
I use AI to help me write some of the blog posts. Here is why and how.
A practical guide to protecting your JavaScript project from npm supply chain attacks using pnpm, Socket Firewall, and frozen lockfiles.
A minimal CSS framework that styles semantic HTML out of the box. No classes required. Terminal-inspired, themeable, accessible.
vibeship lets you describe what your code should do in plain English. It handles the rest at runtime. React, Expo, Fastify, AdonisJS, Django, Actix Web.