{"id":108,"date":"2026-11-01T08:00:00","date_gmt":"2026-11-01T07:00:00","guid":{"rendered":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/"},"modified":"2026-10-16T14:00:13","modified_gmt":"2026-10-16T12:00:13","slug":"claude-code-permissions-allowlists-deny-rules-and-sandboxing","status":"publish","type":"post","link":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/","title":{"rendered":"Claude Code permissions: allowlists, deny rules and sandboxing"},"content":{"rendered":"<p>Hi folks,<\/p>\n<p>The first week with an AI coding agent goes like this: it asks before every command, you press Enter fifty times an hour, and on day three you start pressing Enter without reading. That is the worst of both worlds. You are interrupted all the time and you are not really reviewing anything.<\/p>\n<p>The fix is not to switch everything off. The fix is a small, deliberate permission file per project: routine read-only commands run without asking, risky ones always ask, and a few things are simply forbidden. Here is how I set this up for a TYPO3 project in DDEV, based on the official Claude Code permission rules.<\/p>\n<h2>How the rules are evaluated<\/h2>\n<p>Permission rules live under <code>permissions<\/code> in a settings file, in three lists: <code>allow<\/code>, <code>ask<\/code> and <code>deny<\/code>. Three facts from the documentation shape everything else:<\/p>\n<ol>\n<li>The order is deny, then ask, then allow. The first match wins, and specificity does not matter. A broad deny like <code>Bash(git push *)<\/code> cannot be opened by a narrow allow.<\/li>\n<li>Deny rules from any scope win. If your user settings allow something and the project denies it, it is denied, and the other way round.<\/li>\n<li>Allow rules in a project&#8217;s <code>.claude\/settings.json<\/code> only apply after you accept the workspace trust dialog for that folder. Deny and ask rules apply anyway, because they only restrict.<\/li>\n<\/ol>\n<p>Team rules go into <code>.claude\/settings.json<\/code> (committed). Personal additions go into <code>.claude\/settings.local.json<\/code>, which is not meant for git.<\/p>\n<h2>The project file<\/h2>\n<pre><code class=\"language-json\">{\n  \"permissions\": {\n    \"allow\": [\n      \"Bash(ddev describe)\",\n      \"Bash(ddev composer validate *)\",\n      \"Bash(ddev composer show *)\",\n      \"Bash(ddev composer audit *)\",\n      \"Bash(ddev exec vendor\/bin\/typo3 cache:flush)\",\n      \"Bash(ddev exec vendor\/bin\/typo3 upgrade:list *)\",\n      \"Bash(ddev exec vendor\/bin\/typo3 site:list)\",\n      \"Bash(git diff *)\",\n      \"Bash(git log *)\",\n      \"mcp__project-checks__*\"\n    ],\n    \"ask\": [\n      \"Bash(ddev composer require *)\",\n      \"Bash(ddev composer update *)\",\n      \"Bash(ddev exec vendor\/bin\/typo3 extension:setup *)\",\n      \"Bash(ddev exec vendor\/bin\/typo3 upgrade:run *)\",\n      \"Bash(git commit *)\"\n    ],\n    \"deny\": [\n      \"Bash(git push *)\",\n      \"Bash(ddev delete *)\",\n      \"Bash(ddev import-db *)\",\n      \"Read(.\/config\/system\/credentials.php)\",\n      \"Read(.\/public\/blog\/wp-config-production.php)\",\n      \"Read(.\/.project-migration\/backups\/**)\"\n    ]\n  }\n}<\/code><\/pre>\n<p>Some notes on the details, because the details are where these files go wrong:<\/p>\n<ul>\n<li><strong>Where the <code>*<\/code> goes.<\/strong> Claude Code matches everything before the first <code>*<\/code> literally. <code>Bash(git log *)<\/code> allows only <code>git log<\/code>; <code>Bash(git *)<\/code> allows every git command, including <code>push<\/code> and <code>-c<\/code> options that run programs. A trailing <code> *<\/code> also matches the bare command, so <code>Bash(ddev composer validate *)<\/code> covers <code>ddev composer validate<\/code> as well.<\/li>\n<li><strong>Compound commands.<\/strong> Claude Code knows shell operators. <code>Bash(git diff *)<\/code> does not approve <code>git diff &amp;&amp; rm -rf var<\/code>; every part must match on its own. Deny and ask rules match any part, even inside a subshell.<\/li>\n<li><strong>Read-only commands are already free.<\/strong> <code>ls<\/code>, <code>cat<\/code>, <code>grep<\/code>, <code>git status<\/code> and other read-only forms of git run without a prompt by default. You do not need allow rules for them; I keep <code>git diff<\/code> and <code>git log<\/code> in the list only to be explicit.<\/li>\n<li><strong>Secrets.<\/strong> <code>Read(...)<\/code> deny rules stop the Read tool and file commands that Claude Code recognises, like <code>cat<\/code> or <code>head<\/code>, and redirections. The paths above are the real secret locations of hoja.in: production credentials and the WordPress production config are not in git, and database dumps with password hashes sit in a git-ignored backup folder.<\/li>\n<\/ul>\n<h2>What I never put into allow<\/h2>\n<ul>\n<li><code>Bash<\/code> or <code>Bash(*)<\/code>. That is every command.<\/li>\n<li><code>Bash(ddev exec *)<\/code>. The documentation explains it for runners like <code>docker exec<\/code> or <code>npx<\/code>: a prefix rule on a runner allows whatever comes after it. <code>ddev exec<\/code> is such a runner; <code>ddev exec rm -rf public\/fileadmin<\/code> would match. Allow the inner commands one by one instead.<\/li>\n<li><code>Bash(ddev composer *)<\/code> or <code>Bash(composer *)<\/code>. Composer runs scripts and plugins from the packages you install. <code>require<\/code> and <code>update<\/code> stay on ask.<\/li>\n<li><code>Bash(curl *)<\/code> and friends. Use the WebFetch tool with <code>WebFetch(domain:docs.typo3.org)<\/code> rules for documentation instead.<\/li>\n<li>The <code>bypassPermissions<\/code> mode outside a container or VM. The docs say exactly that, and I agree.<\/li>\n<\/ul>\n<h2>Deny rules are not a wall<\/h2>\n<p>This surprised me when I read it carefully: a Bash deny rule matches the command text Claude writes, not the program. <code>Bash(git push *)<\/code> stops <code>git push origin main<\/code>, but not <code>git -C . push origin main<\/code> or <code>sh -c 'git push'<\/code>. The documentation lists these cases openly. Deny rules catch the normal way the model writes a command. For a real boundary you need one of the next two layers.<\/p>\n<h2>Layer two: hooks<\/h2>\n<p>A <code>PreToolUse<\/code> hook is your own script that sees every tool call before it runs. It can allow, ask or deny, and a hook that exits with code 2 blocks the call even if an allow rule matches. A hook cannot open what a deny or ask rule closed, though; those are still evaluated. For hoja.in, the guard hook of my migration plugin denied database-writing TYPO3 commands unless a dump younger than 24 hours existed. No string rule can express &#8220;only if a fresh backup exists&#8221;, a script can.<\/p>\n<h2>Layer three: the sandbox<\/h2>\n<p>The Bash sandbox is enforced by the operating system (Seatbelt on macOS, bubblewrap on Linux and WSL2). Sandboxed commands can only write where you allow it and reach only allowed network hosts through a proxy, and that holds for child processes too. You switch it on with <code>\/sandbox<\/code> or in settings:<\/p>\n<pre><code class=\"language-json\">{\n  \"sandbox\": {\n    \"enabled\": true,\n    \"network\": {\n      \"allowedDomains\": [\"github.com\", \"packagist.org\", \"repo.packagist.org\"]\n    }\n  }\n}<\/code><\/pre>\n<p>Now the honest part for DDEV users: the documentation says <code>docker<\/code> is incompatible with the sandbox, and DDEV is Docker. The documented way out is <code>sandbox.excludedCommands<\/code>, for example <code>\"ddev *\"<\/code>, and excluded commands run with your full access. So in a DDEV project the sandbox protects host-side commands (git, npm, scripts), while every <code>ddev<\/code> command depends on permissions and hooks again. Know this before you rely on it. Also good to know: hooks and local MCP servers always run outside the sandbox, with your user&#8217;s rights.<\/p>\n<h2>A rhythm that works<\/h2>\n<ol>\n<li>Start with a short allow list of read-only commands you see the agent run every day.<\/li>\n<li>When a prompt appears for the fifth time and it is harmless, add an exact rule, not a broader one.<\/li>\n<li>Put everything that changes the database, dependencies or git history on ask, and read those prompts properly. There are few of them now, so you can.<\/li>\n<li>Deny what must never happen, then back it with a hook if it really matters.<\/li>\n<li>Run <code>\/permissions<\/code> from time to time; it shows every rule and the file it comes from.<\/li>\n<\/ol>\n<p>With this, the prompts that remain are few, and each one is a real decision. Cheers!<\/p>\n<h2>Further reading<\/h2>\n<ul>\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/permissions\">Claude Code: configure permissions<\/a><\/li>\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/sandboxing\">Claude Code: configure the sandboxed Bash tool<\/a><\/li>\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/hooks\">Claude Code hooks reference<\/a><\/li>\n<li><a href=\"https:\/\/code.claude.com\/docs\/en\/settings\">Claude Code settings<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Approving every command is tiring, approving everything is dangerous. A settings.json for a TYPO3 project in DDEV, rules I never add, and how hooks and the sandbox fit in.<\/p>\n","protected":false},"author":1,"featured_media":109,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[18],"tags":[34,35,45,43],"class_list":["post-108","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ai-engineering","tag-ai-agents","tag-claude-code","tag-devops","tag-security"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.7 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Claude Code permissions for a TYPO3 project<\/title>\n<meta name=\"description\" content=\"A Claude Code settings.json for a TYPO3 project in DDEV: allow, ask and deny rules, what never to allow, and how hooks and the sandbox add to them.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Claude Code permissions for a TYPO3 project\" \/>\n<meta property=\"og:description\" content=\"A Claude Code settings.json for a TYPO3 project in DDEV: allow, ask and deny rules, what never to allow, and how hooks and the sandbox add to them.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/\" \/>\n<meta property=\"og:site_name\" content=\"Hoja Mustaffa Abdul Latheef \u2013 Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-01T07:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/claude-code-permissions-allowlists-deny-rules-and-sandboxing.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Hoja Mustaffa Abdul Latheef\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@hojaonline\" \/>\n<meta name=\"twitter:site\" content=\"@hojaonline\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Hoja Mustaffa Abdul Latheef\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/\"},\"author\":{\"name\":\"Hoja Mustaffa Abdul Latheef\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"headline\":\"Claude Code permissions: allowlists, deny rules and sandboxing\",\"datePublished\":\"2026-11-01T07:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/\"},\"wordCount\":909,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing.jpg\",\"keywords\":[\"AI agents\",\"Claude Code\",\"DevOps\",\"Security\"],\"articleSection\":[\"AI engineering\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/\",\"name\":\"Claude Code permissions for a TYPO3 project\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing.jpg\",\"datePublished\":\"2026-11-01T07:00:00+00:00\",\"description\":\"A Claude Code settings.json for a TYPO3 project in DDEV: allow, ask and deny rules, what never to allow, and how hooks and the sandbox add to them.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/#primaryimage\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing.jpg\",\"contentUrl\":\"https:\\\/\\\/hoja.in\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing.jpg\",\"width\":1200,\"height\":630,\"caption\":\"Allow less, prompt less\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Claude Code permissions: allowlists, deny rules and sandboxing\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/hoja.in\\\/blog\\\/\",\"name\":\"Hoja Mustaffa Abdul Latheef \u2013 Blog\",\"description\":\"Notes from daily work with TYPO3, PHP and AI-assisted engineering\",\"publisher\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/hoja.in\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/e6fbd54c2061674d8ea3e7861d858c7b\",\"name\":\"Hoja Mustaffa Abdul Latheef\",\"logo\":{\"@id\":\"https:\\\/\\\/hoja.in\\\/blog\\\/#\\\/schema\\\/person\\\/image\\\/\"},\"description\":\"Senior TYPO3 Developer at jweiland.net, TYPO3 CMS Certified Developer. I write about TYPO3 upgrades, extension development, PHP and AI-assisted engineering with Claude Code.\",\"sameAs\":[\"https:\\\/\\\/hoja.in\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Claude Code permissions for a TYPO3 project","description":"A Claude Code settings.json for a TYPO3 project in DDEV: allow, ask and deny rules, what never to allow, and how hooks and the sandbox add to them.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/","og_locale":"en_US","og_type":"article","og_title":"Claude Code permissions for a TYPO3 project","og_description":"A Claude Code settings.json for a TYPO3 project in DDEV: allow, ask and deny rules, what never to allow, and how hooks and the sandbox add to them.","og_url":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/","og_site_name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","article_published_time":"2026-11-01T07:00:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/claude-code-permissions-allowlists-deny-rules-and-sandboxing.jpg","type":"image\/jpeg"}],"author":"Hoja Mustaffa Abdul Latheef","twitter_card":"summary_large_image","twitter_creator":"@hojaonline","twitter_site":"@hojaonline","twitter_misc":{"Written by":"Hoja Mustaffa Abdul Latheef","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/#article","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/"},"author":{"name":"Hoja Mustaffa Abdul Latheef","@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"headline":"Claude Code permissions: allowlists, deny rules and sandboxing","datePublished":"2026-11-01T07:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/"},"wordCount":909,"commentCount":0,"publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"image":{"@id":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/claude-code-permissions-allowlists-deny-rules-and-sandboxing.jpg","keywords":["AI agents","Claude Code","DevOps","Security"],"articleSection":["AI engineering"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/","url":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/","name":"Claude Code permissions for a TYPO3 project","isPartOf":{"@id":"https:\/\/hoja.in\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/#primaryimage"},"image":{"@id":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/#primaryimage"},"thumbnailUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/claude-code-permissions-allowlists-deny-rules-and-sandboxing.jpg","datePublished":"2026-11-01T07:00:00+00:00","description":"A Claude Code settings.json for a TYPO3 project in DDEV: allow, ask and deny rules, what never to allow, and how hooks and the sandbox add to them.","breadcrumb":{"@id":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/#primaryimage","url":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/claude-code-permissions-allowlists-deny-rules-and-sandboxing.jpg","contentUrl":"https:\/\/hoja.in\/blog\/wp-content\/uploads\/2026\/10\/claude-code-permissions-allowlists-deny-rules-and-sandboxing.jpg","width":1200,"height":630,"caption":"Allow less, prompt less"},{"@type":"BreadcrumbList","@id":"https:\/\/hoja.in\/blog\/claude-code-permissions-allowlists-deny-rules-and-sandboxing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/hoja.in\/blog\/"},{"@type":"ListItem","position":2,"name":"Claude Code permissions: allowlists, deny rules and sandboxing"}]},{"@type":"WebSite","@id":"https:\/\/hoja.in\/blog\/#website","url":"https:\/\/hoja.in\/blog\/","name":"Hoja Mustaffa Abdul Latheef \u2013 Blog","description":"Notes from daily work with TYPO3, PHP and AI-assisted engineering","publisher":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/hoja.in\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/e6fbd54c2061674d8ea3e7861d858c7b","name":"Hoja Mustaffa Abdul Latheef","logo":{"@id":"https:\/\/hoja.in\/blog\/#\/schema\/person\/image\/"},"description":"Senior TYPO3 Developer at jweiland.net, TYPO3 CMS Certified Developer. I write about TYPO3 upgrades, extension development, PHP and AI-assisted engineering with Claude Code.","sameAs":["https:\/\/hoja.in\/"]}]}},"_links":{"self":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/108","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/comments?post=108"}],"version-history":[{"count":1,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/108\/revisions"}],"predecessor-version":[{"id":177,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/posts\/108\/revisions\/177"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media\/109"}],"wp:attachment":[{"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/media?parent=108"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/categories?post=108"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/hoja.in\/blog\/wp-json\/wp\/v2\/tags?post=108"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}