CLAUDE LABJP
OUTPUT — v2.1.237 ships a built-in Concise output style that leads with results and skips preamble, without cutting any corners on the work itself. Pick it under Output style in /configCACHE — v2.1.237 fixes prompt caching for sessions running through an LLM gateway or a custom base URL. If you work behind a company proxy, your effective per-token cost just changedCONFIG — v2.1.236 adds ANTHROPIC_DEFAULT_MODEL to set which model new sessions start on. A /model pick still overrides it and persists across restarts, unlike ANTHROPIC_MODELNOTIFY — With notify_when_idle in v2.1.236, one Claude Code session can ask another on the same machine for a single heads-up when it next goes idle. Opt-in, one-shot, no pollingSECURITY — On macOS, wildcard read-deny rules now win inside allowed read regions, cover the contents of matched directories, and can no longer be sidestepped by renaming the filePRICING — Claude Sonnet 5's introductory $2 per million input and $10 output ends August 31, with standard $3 and $15 pricing starting September 1. Ten days to goOUTPUT — v2.1.237 ships a built-in Concise output style that leads with results and skips preamble, without cutting any corners on the work itself. Pick it under Output style in /configCACHE — v2.1.237 fixes prompt caching for sessions running through an LLM gateway or a custom base URL. If you work behind a company proxy, your effective per-token cost just changedCONFIG — v2.1.236 adds ANTHROPIC_DEFAULT_MODEL to set which model new sessions start on. A /model pick still overrides it and persists across restarts, unlike ANTHROPIC_MODELNOTIFY — With notify_when_idle in v2.1.236, one Claude Code session can ask another on the same machine for a single heads-up when it next goes idle. Opt-in, one-shot, no pollingSECURITY — On macOS, wildcard read-deny rules now win inside allowed read regions, cover the contents of matched directories, and can no longer be sidestepped by renaming the filePRICING — Claude Sonnet 5's introductory $2 per million input and $10 output ends August 31, with standard $3 and $15 pricing starting September 1. Ten days to go
Articles/Claude Code
Claude Code/2026-08-21Intermediate

My read-deny rules never reached inside the folder I had allowed

An audit of how far permissions.deny Read rules actually reach in a working tree where secrets and source code live side by side, with a script you can run today.

Claude Code228permissions8settings.json5security17indie development19

Premium Article

I was doing a cleanup pass over my working tree when I stopped.

.env was in the deny list. So was the whole secrets/ directory. And yet tools/backup/.env.bak matched nothing at all.

It was a backup I had taken six months earlier, before swapping some configuration around. The contents were untouched, and the keys inside it still worked.

The short version

permissions.deny Read rules block whatever matches the patterns you wrote. That sounds obvious, but here is what it means for a real working tree: safety is not measured by how many rules you wrote, it is measured by how many secrets are still uncovered.

In my setup, a naive two-line configuration left eight files completely untouched by any rule. Rewriting it as ten lines brought that number to zero.

What follows is how I counted, and what I decided afterwards.

Secrets and source living in the same tree

Clean repository separation does not always survive contact with how an indie developer actually works.

In my case, iOS and Android apps sit alongside several sites under a single synced folder. The app side holds the signing keys used for Google Play submissions and google-services.json; the site side holds a .dev.vars for Cloudflare. Keeping them next to the build configuration and assets is what makes daily work possible, so physically splitting them apart was never a realistic option.

Which means the files I want an agent to read and the files it must never touch are mixed together a few levels down from the same root. Once you add that root to permissions.allow, the precision of your deny rules becomes your actual security posture.

Here is where I started:

{
  "permissions": {
    "deny": [
      "Read(./.env)",
      "Read(./secrets/**)"
    ]
  }
}

That was enough on the day I wrote it. It stopped being enough because the tree kept growing.

Thank you for reading this far.

Continue Reading

What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.

WHAT YOU'LL LEARN
You will be able to list exactly which files your deny rules reach today, instead of assuming the rules you wrote are doing their job
You will be able to close the gap where a backup extension or a rename quietly pushes a secret outside your patterns, before it ever costs you
You will be able to choose a two-layer defence that combines deny rules with how you lay out the tree itself
Secure payment via Stripe · Cancel anytime

Unlock This Article

Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Claude Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $10 for lifetime access
View Membership →

Related Articles

Claude Code2026-08-20
Take Inventory of What You Allowed with Don't Ask Again in Claude Code
After clicking Don't ask again a few dozen times, can you still explain what you approved? Here is a script that counts your current rules, plus a way to rebuild permissions from the smallest possible set.
Claude Code2026-08-10
The Same rm -rf Was Recoverable in Ten Places and Unrecoverable in Five — Measuring Reversibility Before Auto Mode Becomes the Default
Auto mode becomes the default on Pro, Max and Team from August 14. It stops on operations judged irreversible, destructive, or outward-facing — but reversibility turned out to be a property of state, not of commands. Here is the probe and the measurements.
Claude Code2026-04-13
Claude Code Tool Permissions: Custom Allow/Deny Policies
Learn how to control Claude Code tool permissions with allowedTools, disallowedTools, and settings.json. Includes project-specific permission patterns for frontend, backend, and read-only review scenarios.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →