I kept rebuilding the same little secret resolver. The first version was not a package. It was just a helper tucked into whatever script needed it that week. Try 1Password first. If that fails, try an environment variable. Do not print the token. Do not write it to disk. Report enough provenance that I can see whether a command used op or an env var, but never report the value. This grew out of…
The Problem I recently spent a few minutes trying to figure out whether Codex was reading a global AGENTS.md instruction. That debugging path was not very interesting by itself. The useful thing I learned was that Codex has a command for inspecting the exact prompt input it assembles before a session starts. That is valuable beyond this one problem. When working with agentic coding tools, a lot of…
A follow-up to TIL: uv Settings I Changed after LiteLLM . After my last post, a couple of commenters pushed back on recommendation 2 - the constraint-dependencies entry blocking litellm 1.82.7 and 1.82.8. The argument, paraphrased: PyPI pulled those versions, so they’re no longer installable. The constraint is unnecessary work defending against something that can’t happen. I appreciate their…
This article was updated on 3/29/26 to correct an error in the second recommendation and to cross-link it to another article elaborating on my justification for the same. The Problem On March 24, 2026, an attacker ( TeamPCP ) compromised the CI/CD pipeline of litellm , a popular Python LLM proxy library with ~3.4 million daily downloads. They stole the PyPI publishing token via a poisoned Trivy…
The Problem You’re running something in tmux — a build, a test suite, an agent CLI. While it’s working, you scroll back to review earlier output. The yellow copy-mode indicator appears, you find what you’re looking for, and then… you sit there. Waiting. The command finished two minutes ago, but you’re staring at frozen scrollback with no way to know. This happens to me regularly with agent CLIs…
The Problem I had a file called r2vars in a project root with plaintext Cloudflare R2 credentials: export R2_ACCOUNT_ID = abc123 export R2_ACCESS_KEY_ID = def456 export R2_SECRET_ACCESS_KEY = ghi789 export STORAGE_BACKEND = r2 Plaintext secrets, BAD! 😖 Scripts referenced it as source r2vars && uv run python scripts/some_script.py . It worked, but the file was a liability - one bad .gitignore away…
The Problem When Claude Code needs Python for ad-hoc tasks (e.g., parsing Excel files, reading PDFs, quick data analysis) it uses whatever Python is available. This can cause issues: No isolation: packages installed to user site-packages Version uncertainty: using whatever Python happened to be installed Dependency conflicts: risk of polluting project-specific environments Ambiguity: no clear…
I’ve had “configure Claude Code permissions properly” on my list for a while. The defaults work, but every session starts with a flurry of “allow this?” prompts. I wanted less babysitting and more security - and it turns out those aren’t opposed. You just have to understand how the pieces fit together. The Three Layers Claude Code has three layers of access control: Permission rules These let you…
The Problem I had a growing markdown style guide in my CLAUDE.md that was bloating my main config. Every session loaded 50+ lines of formatting rules that only mattered when editing .md or .qmd files. I needed a better home for it. Claude Code has four mechanisms for giving it instructions: CLAUDE.md , skills, rules, and hooks. It also has agents (isolated task workers) and MCP servers (external…
The Problem I needed an ADMIN_TOKEN available in my terminal for production monitoring commands. I didn’t want to: Export it inline before each command (clumsy, exposes secrets in LLM chat histories) Write wrapper scripts/aliases that set it (adds complexity) Set it globally in ~/.zshrc (always loaded, pollutes environment) Store it in .env (unused until explicitly loaded by an application or…
The Problem I leverage LLMs like Claude and Cursor when generating lecture materials. They accelerate my work and help improve the end product with better sample code, etc. But all of those tools still struggle when creating / editing Jupyter notebooks, which is my medium of choice for this work. They can do it, but it is often a slow, cumbersome, more error-prone process. They sometimes resort to…
Context I regularly use Quarto and pandoc for converting markdown to PDF, but just got a new Mac. Time to set up the TeX ecosystem properly from scratch. Installing BasicTeX brew install --cask basictex Why BasicTeX instead of MacTeX? Size: ~90MB vs 4GB Sufficient: provides the TeX engines and package manager needed for pandoc/Quarto Focused: avoids GUI apps and specialized packages I don’t need…
The Problem I needed PDF versions of my Reveal.js slide decks - for student handouts and accessibility. The slides look great in the browser, but getting them into PDF is surprisingly painful. Reveal.js has a built-in export: append ?print-pdf to the URL, then use Chrome’s print dialog. In practice, this means manually setting landscape orientation, zero margins, and enabling background graphics…
Why Antisimplistic I’ve been using this handle for almost 30 years. It emerged from frustration - the productive kind. I was working with my business partner and friend. 1 Our roles boiled down to this: he was business development, I was production. Classic setup, familiar tension. He’d make promises; I’d have to figure out how to keep them. When I’d explain why something was harder than it…