[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"$f324v1q5sx79yt":3,"$fanuq43nlrv5g":54},{"slug":4,"title":5,"body":6,"summary":7,"tags":8,"author":14,"cover_url":15,"published_at":16,"seo_title":17,"seo_description":18,"reading_minutes":19,"related":20},"sandbox-local-mcp-servers-srt-without-docker","Sandbox your local MCP servers without Docker: Anthropic's srt on Seatbelt and bubblewrap","\u003Cp>A local MCP server is a process your agent starts with your user account. It can read your \u003Ccode>~\u002F.ssh\u003C\u002Fcode>, write to your shell profile and call any host on the internet. Most of the time that is fine. The day a server has a bug, a malicious dependency or a prompt-injected tool call, it is not.\u003C\u002Fp>\n\u003Cfigure data-post-media=\"6ae040461edd7a39ec50fd68\">\u003Cvideo src=\"https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ae040471edd7a39ec50fd6e-0-0f203e71.mp4\" autoplay muted loop playsinline preload=\"metadata\">\u003C\u002Fvideo>\u003C\u002Ffigure>\n\u003Cfigure data-post-media=\"6ae039081edd7a39ec50fb3e\">\u003Cimg src=\"https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ae039081edd7a39ec50fb43-0-0464101b.png\" alt=\"The sandbox-runtime creates a secure boundary around local processes.\" loading=\"lazy\">\u003Cfigcaption>The sandbox-runtime creates a secure boundary around local processes.\u003C\u002Ffigcaption>\u003C\u002Ffigure>\n\u003Cp>Anthropic's \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fsandbox-runtime\">sandbox-runtime\u003C\u002Fa> (the \u003Ccode>srt\u003C\u002Fcode> CLI, built for Claude Code) puts a process behind filesystem and network rules using the operating system's own tools: \u003Ccode>sandbox-exec\u003C\u002Fcode> with generated Seatbelt profiles on macOS, bubblewrap on Linux. There is no container, no image and no daemon. This guide wraps an MCP server in it in about 15 minutes. Everything below comes from the project's README; the project calls itself a research preview and warns that its APIs and config format may change, so check the README if a key stops working.\u003C\u002Fp>\n\n\u003Ch2>1. Install srt and its helpers (3 minutes)\u003C\u002Fh2>\n\u003Cpre class=\"code-block\" data-lang=\"bash\">\u003Ccode class=\"hljs language-bash\">npm install -g @anthropic-ai\u002Fsandbox-runtime\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>macOS needs \u003Ccode>ripgrep\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" data-lang=\"bash\">\u003Ccode class=\"hljs language-bash\">brew install ripgrep\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Linux needs \u003Ccode>bubblewrap\u003C\u002Fcode>, \u003Ccode>socat\u003C\u002Fcode> and \u003Ccode>ripgrep\u003C\u002Fcode> (Debian\u002FUbuntu package names):\u003C\u002Fp>\n\u003Cpre class=\"code-block\" data-lang=\"bash\">\u003Ccode class=\"hljs language-bash\">\u003Cspan class=\"hljs-built_in\">sudo\u003C\u002Fspan> apt install bubblewrap socat ripgrep\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>On Ubuntu 24.04 and later, unprivileged user namespaces may be restricted by AppArmor. The README says you may need \u003Ccode>kernel.apparmor_restrict_unprivileged_userns\u003C\u002Fcode> set to 0 or an AppArmor profile for bubblewrap. Windows support exists but is alpha; this guide covers macOS and Linux.\u003C\u002Fp>\n\n\u003Ch2>2. See the defaults block things (2 minutes)\u003C\u002Fh2>\n\u003Cp>With no settings file, srt allows reads, denies network access and denies writes outside a few default paths. Try it:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" data-lang=\"bash\">\u003Ccode class=\"hljs language-bash\">srt \u003Cspan class=\"hljs-string\">&quot;curl example.com&quot;\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cpre class=\"code-block\">\u003Ccode class=\"hljs\">Running: curl example.com\nConnection blocked by network allowlist\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Reads are open by default, which is the part to fix first. Your keys are still readable:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" data-lang=\"bash\">\u003Ccode class=\"hljs language-bash\">srt \u003Cspan class=\"hljs-string\">&quot;cat ~\u002F.ssh\u002Fid_rsa&quot;\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>That works until you add a \u003Ccode>denyRead\u003C\u002Fcode> rule. Network is closed, reads are open: keep that in mind for the rest of the guide.\u003C\u002Fp>\n\n\u003Ch2>3. Write a deny-by-default settings file (4 minutes)\u003C\u002Fh2>\n\u003Cp>srt reads \u003Ccode>~\u002F.srt-settings.json\u003C\u002Fcode> by default. The file is optional, but if it exists and is empty, unreadable or invalid JSON, srt stops with an error instead of falling back to the defaults. Paths can be relative to the current working directory, and \u003Ccode>~\u003C\u002Fcode> expands to your home directory.\u003C\u002Fp>\n\u003Cfigure data-post-media=\"6ae039081edd7a39ec50fb48\">\u003Cimg src=\"https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ae039081edd7a39ec50fb4d-0-1a101987.png\" alt=\"A deny-by-default approach ensures only explicitly permitted access is granted.\" loading=\"lazy\">\u003Cfigcaption>A deny-by-default approach ensures only explicitly permitted access is granted.\u003C\u002Ffigcaption>\u003C\u002Ffigure>\n\u003Cp>A starting point for an MCP server that only needs the project folder and no network:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" data-lang=\"json\">\u003Ccode class=\"hljs language-json\">\u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">&quot;network&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;allowedDomains&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;deniedDomains&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;allowLocalBinding&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">\u003Cspan class=\"hljs-keyword\">false\u003C\u002Fspan>\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">&quot;filesystem&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;denyRead&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-string\">&quot;~\u002F.ssh&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;~\u002F.aws&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;~\u002F.config\u002Fgh&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;~\u002F.netrc&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;allowRead&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;allowWrite&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-string\">&quot;.&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;denyWrite&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-string\">&quot;.env&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n\u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>How the rules combine, per the README:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Network\u003C\u002Fstrong> is deny-all. Only hosts in \u003Ccode>allowedDomains\u003C\u002Fcode> get through; wildcards (\u003Ccode>*.github.com\u003C\u002Fcode>) and \u003Ccode>:port\u003C\u002Fcode> suffixes are supported.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Reads\u003C\u002Fstrong> are allowed by default. \u003Ccode>denyRead\u003C\u002Fcode> hides paths, and \u003Ccode>allowRead\u003C\u002Fcode> overrides \u003Ccode>denyRead\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Writes\u003C\u002Fstrong> are denied by default. \u003Ccode>allowWrite\u003C\u002Fcode> opens paths, and \u003Ccode>denyWrite\u003C\u002Fcode> wins over \u003Ccode>allowWrite\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>The \u003Ccode>denyRead\u003C\u002Fcode> list above is an example; add whatever holds credentials on your machine. Some files are always write-protected, even inside an allowed path: \u003Ccode>.bashrc\u003C\u002Fcode>, \u003Ccode>.bash_profile\u003C\u002Fcode>, \u003Ccode>.zshrc\u003C\u002Fcode>, \u003Ccode>.zprofile\u003C\u002Fcode>, \u003Ccode>.profile\u003C\u002Fcode>, \u003Ccode>.gitconfig\u003C\u002Fcode>, \u003Ccode>.gitmodules\u003C\u002Fcode>, \u003Ccode>.ripgreprc\u003C\u002Fcode>, \u003Ccode>.mcp.json\u003C\u002Fcode>, \u003Ccode>.git\u002Fconfig\u003C\u002Fcode>, and the directories \u003Ccode>.vscode\u002F\u003C\u002Fcode>, \u003Ccode>.idea\u002F\u003C\u002Fcode>, \u003Ccode>.claude\u002Fcommands\u002F\u003C\u002Fcode>, \u003Ccode>.claude\u002Fagents\u002F\u003C\u002Fcode> and \u003Ccode>.git\u002Fhooks\u002F\u003C\u002Fcode>. A sandboxed server cannot rewrite its own MCP config or plant a git hook.\u003C\u002Fp>\n\u003Cp>Check the file before you wire it in:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" data-lang=\"bash\">\u003Ccode class=\"hljs language-bash\">srt \u003Cspan class=\"hljs-string\">&quot;cat ~\u002F.ssh\u002Fid_rsa&quot;\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cpre class=\"code-block\">\u003Ccode class=\"hljs\">cat: \u002FUsers\u002Fyou\u002F.ssh\u002Fid_rsa: Operation not permitted\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>4. Wrap the MCP server (3 minutes)\u003C\u002Fh2>\n\u003Cp>The README's example is the reference filesystem server. Before, in \u003Ccode>.mcp.json\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" data-lang=\"json\">\u003Ccode class=\"hljs language-json\">\u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">&quot;mcpServers&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;filesystem&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">&quot;command&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;npx&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">&quot;args&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-string\">&quot;-y&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;@modelcontextprotocol\u002Fserver-filesystem&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n\u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>After: the command becomes \u003Ccode>srt\u003C\u002Fcode> and the old command moves into \u003Ccode>args\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" data-lang=\"json\">\u003Ccode class=\"hljs language-json\">\u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">&quot;mcpServers&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;filesystem&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">&quot;command&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;srt&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">&quot;args&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-string\">&quot;npx&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;-y&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;@modelcontextprotocol\u002Fserver-filesystem&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n\u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>One practical tweak. \u003Ccode>npx -y\u003C\u002Fcode> downloads the package at start-up, which needs the npm registry and a writable npm cache, and both are closed in a deny-by-default sandbox. The README also warns that a copy in \u003Ccode>&lt;project&gt;\u002Fnode_modules\u002F\u003C\u002Fcode> inside a writable project can be rewritten by a sandboxed command. So install the server globally, outside the sandbox, and run its binary under srt:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" data-lang=\"bash\">\u003Ccode class=\"hljs language-bash\">npm install -g @modelcontextprotocol\u002Fserver-filesystem\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cpre class=\"code-block\" data-lang=\"json\">\u003Ccode class=\"hljs language-json\">\u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">&quot;mcpServers&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;filesystem&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">&quot;command&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;srt&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">&quot;args&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-string\">&quot;mcp-server-filesystem&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;.&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n\u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The \u003Ccode>.\u003C\u002Fcode> is the directory the filesystem server exposes. srt's \u003Ccode>allowWrite: [\".\"]\u003C\u002Fcode> is the outer fence: even if the server's own path checks fail, the OS refuses writes elsewhere. The README's MCP example shows what a blocked write looks like: \u003Ccode>EPERM: operation not permitted\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Different servers need different rules. Give each its own file with \u003Ccode>--settings\u003C\u002Fcode> (use an absolute path, since nothing expands \u003Ccode>~\u003C\u002Fcode> inside \u003Ccode>.mcp.json\u003C\u002Fcode>):\u003C\u002Fp>\n\u003Cpre class=\"code-block\" data-lang=\"json\">\u003Ccode class=\"hljs language-json\">\u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">&quot;mcpServers&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;filesystem&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">&quot;command&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;srt&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n      \u003Cspan class=\"hljs-attr\">&quot;args&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-string\">&quot;--settings&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;\u002FUsers\u002Fyou\u002F.srt\u002Ffilesystem.json&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;mcp-server-filesystem&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;.&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n\u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>5. Open the network one host at a time (2 minutes)\u003C\u002Fh2>\n\u003Cp>Start with \u003Ccode>allowedDomains: []\u003C\u002Fcode> and add hosts only when the server fails without them. A server that talks to the GitHub API needs the API host, not all of GitHub:\u003C\u002Fp>\n\u003Cfigure data-post-media=\"6ae039081edd7a39ec50fb52\">\u003Cimg src=\"https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ae039081edd7a39ec50fb57-0-a29154a8.png\" alt=\"Opening network access one host at a time minimizes the attack surface.\" loading=\"lazy\">\u003Cfigcaption>Opening network access one host at a time minimizes the attack surface.\u003C\u002Ffigcaption>\u003C\u002Ffigure>\n\u003Cpre class=\"code-block\" data-lang=\"json\">\u003Ccode class=\"hljs language-json\">\u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-attr\">&quot;network&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">{\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;allowedDomains&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-string\">&quot;api.github.com&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">,\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-attr\">&quot;deniedDomains&quot;\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">:\u003C\u002Fspan> \u003Cspan class=\"hljs-punctuation\">[\u003C\u002Fspan>\u003Cspan class=\"hljs-punctuation\">]\u003C\u002Fspan>\n  \u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\n\u003Cspan class=\"hljs-punctuation\">}\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The README warns about allowing broad domains like \u003Ccode>github.com\u003C\u002Fcode>: a host where anyone can push content is a way to send data out. Find what a server actually calls with debug logging:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" data-lang=\"bash\">\u003Ccode class=\"hljs language-bash\">srt --debug curl https:\u002F\u002Fexample.com\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Clients that honour proxy settings get a \u003Ccode>403\u003C\u002Fcode> with \u003Ccode>X-Proxy-Error: blocked-by-sandbox-runtime\u003C\u002Fcode> from srt's proxy for blocked hosts, and the block is recorded as a violation. Two more details: an allowed hostname that resolves to loopback, link-local, cloud metadata or a local-interface address is refused, and \u003Ccode>allowLocalBinding\u003C\u002Fcode> stays \u003Ccode>false\u003C\u002Fcode> unless the server must listen on a port (it is ignored on Linux).\u003C\u002Fp>\n\n\u003Ch2>What srt does not protect against\u003C\u002Fh2>\n\u003Cp>Read this section before you rely on it. All of it is from the README.\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>It is a research preview.\u003C\u002Fstrong> Config keys and behaviour may change between releases. Pin a version if a team depends on it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>The network filter stops direct connections, not determined code.\u003C\u002Fstrong> The README's own words: treat it as stopping commands that connect directly, \"not code written to defeat it\". Traffic goes through host-side proxies, and on Linux the proxy environment variables can be ignored by programs that do not respect them (those connections are blocked, not leaked, but expect odd failures).\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Unix sockets are a way out.\u003C\u002Fstrong> They are blocked by default. Allowing one can hand the sandbox a powerful service; the README says allowing \u003Ccode>\u002Fvar\u002Frun\u002Fdocker.sock\u003C\u002Fcode> would effectively grant access to the host system. On Linux, path-based socket allowlists are ignored because seccomp cannot filter by path.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Linux glob gaps.\u003C\u002Fstrong> \u003Ccode>allowWrite\u003C\u002Fcode> and \u003Ccode>denyWrite\u003C\u002Fcode> take literal paths only, some \u003Ccode>denyRead\u003C\u002Fcode> patterns are skipped (and a skipped pattern hides nothing), and denied directories can show up as empty writable tmpfs mounts inside the sandbox. Use plain paths on Linux and test each deny.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Nested sandboxes break.\u003C\u002Fstrong> Nested user namespaces are blocked on Linux, so browser sandboxes, rootless containers and nested bubblewrap fail. Turning on \u003Ccode>allowNestedUserNamespaces\u003C\u002Fcode> weakens the write-deny guarantees.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Some options remove the protection.\u003C\u002Fstrong> \u003Ccode>enableWeakerNetworkIsolation\u003C\u002Fcode> opens a possible exfiltration path through \u003Ccode>trustd\u003C\u002Fcode> on macOS, and \u003Ccode>allowAppleEvents\u003C\u002Fcode> lets a sandboxed command launch any application with no prompt. Set these only in your own user-level config, never from a project file.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>None of this makes srt a reason to run servers you would not otherwise trust. It is a cheap second fence: a server with a path-traversal bug or a hijacked dependency hits the OS's refusal instead of your keys, and a server that tries to reach a host you never listed gets blocked.\u003C\u002Fp>\n\n\u003Ch2>Sources\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fsandbox-runtime\">anthropics\u002Fsandbox-runtime README\u003C\u002Fa> (install, CLI flags, settings schema, MCP example, limitations)\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fmodelcontextprotocol\u002Fservers\u002Ftree\u002Fmain\u002Fsrc\u002Ffilesystem\">modelcontextprotocol\u002Fservers: filesystem server\u003C\u002Fa> (package and \u003Ccode>mcp-server-filesystem\u003C\u002Fcode> binary)\u003C\u002Fli>\n\u003C\u002Ful>","A 15-minute guide to wrapping a local MCP server in Anthropic's sandbox-runtime (srt): install it, start from deny-by-default, open only the paths and domains the server needs, and know what this research preview does not cover.",[9,10,11,12,13],"mcp","sandboxing","security","ai-agents","ai-assisted","if.codes","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ae039071edd7a39ec50fb37-0-1d24ae87.png","2026-10-27T09:02:15.11Z","Sandbox local MCP servers without Docker using Anthropic's srt","Wrap a local MCP server in Anthropic's sandbox-runtime: deny-by-default filesystem and network rules on Seatbelt and bubblewrap, plus its limits.",6,[21,32,43],{"slug":22,"title":23,"type":24,"summary":25,"tags":26,"author":14,"cover_url":30,"published_at":31,"updated_at":31},"vps-zero-inbound-ports-tailscale-ssh-cloudflare-tunnel","Take your VPS off the public internet: SSH over Tailscale, the site behind a Cloudflare Tunnel, and a firewall with zero inbound ports","blog","A lockout-safe order for a small VPS: Tailscale SSH first, then serve the site through cloudflared, then deny every inbound port. Copy-pasteable commands for Ubuntu, and the checks that prove nothing listens publicly.",[11,27,28,29,13],"vps","tailscale","cloudflare","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6add96066f13dd01b60c05c6-0-ef88c8d0.png","2026-10-25T06:30:17.63Z",{"slug":33,"title":34,"type":24,"summary":35,"tags":36,"author":14,"cover_url":40,"published_at":41,"updated_at":42},"php2shell-patch-php-fpm-mod-php-frankenphp","PHP2Shell on your own server: reaching PHP 8.2.35+ on php-fpm, mod_php and FrankenPHP, and the stopgap when you're stuck on 8.1","php.net's 21 October release fixes two unauthenticated RCEs that hit every PHP web SAPI. Version checks that prove the running worker is patched, upgrade paths for distro packages, Docker images and FrankenPHP, and php.net's interim mitigations for 8.1 and older.",[37,11,38,39,13],"php","self-hosting","docker","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6add3fc76f13dd01b60bf641-0-fb344fed.png","2026-10-25T01:43:14.026Z","2026-10-25T01:43:14.027Z",{"slug":44,"title":45,"type":24,"summary":46,"tags":47,"author":14,"cover_url":51,"published_at":52,"updated_at":53},"hetzner-2026-price-round-decision-sheet","Hetzner tripled some new-instance prices: keep, rescale or move — a decision sheet for a small self-hosted stack","Hetzner's June 2026 prices hit new orders and rescales; old servers keep their rate. Why not to rescale a grandfathered box, where Arm CAX still fits, and hcloud commands to price a move.",[48,38,49,50,13],"hetzner","cloud-costs","hcloud","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ada8ebbe6d7e5a76992c1dd-0-f450e23a.png","2026-10-23T00:43:13.645Z","2026-10-23T00:43:13.646Z",[55,58,60,63,65,76,87,97,108,119,130,140,152,161,171,182,193,205,216,227,236,245,258,271,281,292,303,314,322,333,344,353,363,373,382,391],{"slug":4,"title":5,"type":24,"summary":7,"tags":56,"author":14,"cover_url":15,"published_at":16,"reading_minutes":19,"updated_at":57},[9,10,11,12,13],"2026-10-27T09:02:15.111Z",{"slug":22,"title":23,"type":24,"summary":25,"tags":59,"author":14,"cover_url":30,"published_at":31,"reading_minutes":19,"updated_at":31},[11,27,28,29,13],{"slug":33,"title":34,"type":24,"summary":35,"tags":61,"author":14,"cover_url":40,"published_at":41,"reading_minutes":62,"updated_at":42},[37,11,38,39,13],5,{"slug":44,"title":45,"type":24,"summary":46,"tags":64,"author":14,"cover_url":51,"published_at":52,"reading_minutes":19,"updated_at":53},[48,38,49,50,13],{"slug":66,"title":67,"type":24,"summary":68,"tags":69,"author":14,"cover_url":74,"published_at":75,"reading_minutes":19,"updated_at":75},"gpt-4o-gpt-4-1-shutdown-migrate-to-gpt-6-luna","GPT-4o and GPT-4.1 leave the API on January 14: moving to gpt-6-luna without breaking your function calls","OpenAI shuts down four GPT-4o and GPT-4.1 snapshots, and their fine-tunes, on January 14, 2027. Its named replacement, gpt-6-luna, is a reasoning model with one function-calling catch in Chat Completions. Here are two migration paths, a replay test and a token-bill check.",[70,71,72,73,13],"openai","migration","llm-api","function-calling","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ad6f0886ce38bf97b746887-0-cad17c1e.png","2026-10-20T05:42:12.599Z",{"slug":77,"title":78,"type":24,"summary":79,"tags":80,"author":14,"cover_url":84,"published_at":85,"reading_minutes":62,"updated_at":86},"swapping-docker-desktop-for-apple-container","Swapping Docker Desktop for Apple's container: one VM per container on your Mac, what runs unchanged from Docker Hub, and where you still need Docker","Apple's container CLI has been stable since 1.0 in June and is at 1.5.0. A hands-on swap: install, build, run Postgres from Docker Hub, reach it by name, and the gaps (no Compose, slower cold starts, memory that is not handed back) that decide whether Docker stays.",[39,81,82,83,13],"macos","containers","devtools","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ad59fc06ce38bf97b743ea2-0-d7ac665e.png","2026-10-19T06:50:15.817Z","2026-10-19T06:50:15.818Z",{"slug":88,"title":89,"type":24,"summary":90,"tags":91,"author":14,"cover_url":95,"published_at":96,"reading_minutes":62,"updated_at":96},"github-agentic-autofix-codeql-backlog","GitHub's agentic autofix is GA: batching 25 CodeQL alerts into one draft PR, what it bills, and how to review the fixes","Agentic autofix for code-scanning alerts went GA on October 15: Copilot explores the repo, fixes, re-runs CodeQL and opens a draft PR for up to 25 alerts at once. Who can use it, how to turn it on, where the cost lands, how to pick a first batch with gh, and a review checklist.",[92,93,11,94,13],"github","codeql","code-review","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ad48184af8e63ad10e8aaa1-0-4c6cfc5e.png","2026-10-19T00:20:22.102Z",{"slug":98,"title":99,"type":24,"summary":100,"tags":101,"author":14,"cover_url":105,"published_at":106,"reading_minutes":107,"updated_at":106},"claude-code-permission-rules-yes-to-all","'Yes to all' is a permission policy: writing Claude Code allow, ask and deny rules that hold up against compound commands and wildcards","Every 'Yes, and don't ask again' writes a rule. Turn that habit into a reviewed .claude\u002Fsettings.json: deny beats ask beats allow, why Bash(git * main) also allows git push, how compound commands are split, and when dontAsk or the sandbox beats bypassPermissions.",[102,103,11,104,13],"claude-code","permissions","developer-tools","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ad2fd1602d67a73cf1eaa23-0-68817e09.png","2026-10-17T23:06:09.746Z",7,{"slug":109,"title":110,"type":24,"summary":111,"tags":112,"author":14,"cover_url":117,"published_at":118,"reading_minutes":19,"updated_at":118},"go-1-27-http1-connection-reuse-body-draining","710 ms to 150 ms for 100 requests: what Go 1.27's HTTP\u002F1 connection reuse fixes, and the body-draining habit to keep for older clients","Go 1.27 drains unread HTTP\u002F1 response bodies for you, so a closed-but-unread body no longer kills connection reuse. A runnable test that counts reused connections, the two patterns that broke reuse, and a capped drain helper for Go 1.26 and older.",[113,114,115,116,13],"go","http","performance","networking","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ad1d8da69fb9bde4cc895fb-0-e539bbf2.png","2026-10-16T23:32:12.783Z",{"slug":120,"title":121,"type":24,"summary":122,"tags":123,"author":14,"cover_url":127,"published_at":128,"reading_minutes":19,"updated_at":129},"claude-code-subagent-prompt-cache-ttl","Claude Code subagents get a 5-minute cache even on a subscription: when to set it to 1h, and how to check","On a subscription your main Claude Code conversation gets a one-hour prompt cache, but subagents, workflows and compaction stay at five minutes. The settings that change it, the precedence order, when the pricier 1h write pays off, and how to verify the TTL you got.",[102,124,125,126,13],"prompt-caching","subagents","llm-costs","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ad0968473d443ad8fa7adbe-0-f2f3fe8c.png","2026-10-15T22:21:15.624Z","2026-10-15T22:21:15.625Z",{"slug":131,"title":132,"type":24,"summary":133,"tags":134,"author":14,"cover_url":137,"published_at":138,"reading_minutes":62,"updated_at":139},"postgres-slow-vps-benchmark-the-disk-first","Postgres feels slow on your VPS? Benchmark the disk before you touch postgresql.conf","ClickHouse measured the same Postgres box at 16,030 TPS on local NVMe and 1,734 TPS on a baseline gp3 volume, with most of the gap spent waiting on storage. A 15-minute fio and pg_test_fsync check tells you which side of that table your VPS is on.",[135,38,115,136,13],"postgres","databases","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6acdb5d473d443ad8fa7555c-0-dd05a138.png","2026-10-13T05:44:15.759Z","2026-10-13T05:44:15.76Z",{"slug":141,"title":142,"type":24,"summary":143,"tags":144,"author":14,"cover_url":148,"published_at":149,"reading_minutes":150,"updated_at":151},"quoted-tilde-in-path-check","A quoted ~ in your PATH runs whatever sits in .\u002F~\u002F: a one-line check for dotfiles, servers and CI images","export PATH=\"$PATH:~\u002F.local\u002Fbin\" never expands the tilde. Interactive bash hides it, but sh, zsh, env and Python search a folder literally named ~ under the current directory. The check, the fix, and where to grep.",[145,146,11,147,13],"linux","shell","devops","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6acd3f0073d443ad8fa743bf-0-c8db0f5d.png","2026-10-12T23:53:16.705Z",4,"2026-10-12T23:53:16.706Z",{"slug":153,"title":154,"type":24,"summary":155,"tags":156,"author":14,"cover_url":158,"published_at":159,"reading_minutes":19,"updated_at":160},"docker-published-ports-bypass-ufw-vps-hardening","Docker publishes ports straight past UFW: hardening a fresh VPS without the firewall rule that does nothing","ufw deny 8080 does not stop a Docker container published on 8080. Docker's own docs explain why. A 15-minute fresh-VPS walkthrough: key-only SSH, ufw, then the two fixes that actually close a container port, and a scan from outside to prove it.",[39,11,27,157,13],"firewall","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6acb12dddbaf8c2bc523d0bb-0-21ee3023.png","2026-10-11T05:42:15.363Z","2026-10-11T05:42:15.364Z",{"slug":162,"title":163,"type":24,"summary":164,"tags":165,"author":14,"cover_url":168,"published_at":169,"reading_minutes":19,"updated_at":170},"deno-deploy-shutdown-exit-guide","Deno Deploy shuts down in six months: moving a small app to Cloudflare Workers, self-hosted Deno in Docker, or Node","Deno is joining Cloudflare: Deploy has six months left and the runtime gets a year of fixes. Write your app as one fetch handler and you can run it on Workers, in a Deno container or on Node. Code for all three, plus what does not carry over.",[166,167,71,39,13],"deno","cloudflare-workers","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ac9c181dbaf8c2bc523a0fd-0-caa268de.png","2026-10-10T05:47:19.665Z","2026-10-10T05:47:19.666Z",{"slug":172,"title":173,"type":24,"summary":174,"tags":175,"author":14,"cover_url":179,"published_at":180,"reading_minutes":107,"updated_at":181},"durable-object-alarm-loop-guards","The Durable Object alarm that cost $10,000: guarding setAlarm() loops with backoff, idempotency and a kill switch","Durable Object alarms are at-least-once, retried, and usually rescheduled from inside the handler, which makes a billing loop easy to write. Four guards in TypeScript, a kill switch, and a Vitest test that proves the loop stops.",[29,176,177,178,13],"durable-objects","typescript","cost-control","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ac8709b392a85804f209fb3-0-9143ed0c.png","2026-10-09T06:09:10.127Z","2026-10-09T06:09:10.128Z",{"slug":183,"title":184,"type":24,"summary":185,"tags":186,"author":14,"cover_url":191,"published_at":192,"reading_minutes":19,"updated_at":192},"cctld-hijack-counterfeit-certs-caa-accounturi-ct-watch","Counterfeit certs via hijacked ccTLDs: CAA with accounturi and a CT watch for your domains in 15 minutes","Attackers took over the .gh, .sl and .as registries and got 12 valid certificates for Google domains. CAA would not have stopped the hijack. Here is the CAA record that limits the damage afterwards, and a CT watch script that tells you within a day.",[187,188,189,190,13],"tls","caa","certificate-transparency","dns","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ac75337392a85804f207d25-0-12f538ac.png","2026-10-08T22:47:12.408Z",{"slug":194,"title":195,"type":24,"summary":196,"tags":197,"author":14,"cover_url":202,"published_at":203,"reading_minutes":19,"updated_at":204},"embeddinggemma-2-qdrant-truncation-recall","EmbeddingGemma 2 in Qdrant: one 740M model for text, images and audio, and what truncating 768 to 128 dims costs your recall","Google's open multimodal embedder runs locally and truncates from 768 to 128 dims. Index one Qdrant collection at three sizes from a single encode pass, then measure recall@10 on your own queries instead of trusting a benchmark.",[198,199,200,201,13],"embeddings","qdrant","rag","open-models","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ac5cceedf0d655df505306e-0-d17d0fef.png","2026-10-07T07:21:20.071Z","2026-10-07T07:21:20.072Z",{"slug":206,"title":207,"type":24,"summary":208,"tags":209,"author":14,"cover_url":213,"published_at":214,"reading_minutes":62,"updated_at":215},"cloudflare-access-strict-service-token-auth-migration","Strict service token auth in Cloudflare Access: moving your scripts and CI over before it bites","Cloudflare Access now has a strict mode for service tokens: 401\u002F403 instead of a 302 to the login page, only Service Auth policies count, and no CF_Authorization cookie. New orgs get it forced on from 5 October. A 15-minute check and switch for existing orgs.",[29,210,211,212,13],"zero-trust","ci-cd","authentication","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ac4a8860956594c947bd197-0-f768b25b.png","2026-10-06T08:30:13.154Z","2026-10-06T08:30:13.155Z",{"slug":217,"title":218,"type":24,"summary":219,"tags":220,"author":14,"cover_url":224,"published_at":225,"reading_minutes":19,"updated_at":226},"cloudflare-traces-trace-rules-debug-one-customer","Why was that request blocked? Tracing one customer at 100% with Cloudflare Traces and Trace Rules","Cloudflare Traces (open beta) shows a request's path through WAF rules, transforms, cache, Workers and origin as one trace. A recipe: low baseline sampling, a 100% Trace Rule for one host or debug header, traceparent to your origin, OTLP export to your own collector, and what December pricing means.",[29,221,222,223,13],"observability","opentelemetry","tracing","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ac338052cb6b40613ac2b7c-0-2294d114.png","2026-10-05T06:22:19.055Z","2026-10-05T06:22:19.056Z",{"slug":228,"title":229,"type":24,"summary":230,"tags":231,"author":14,"cover_url":234,"published_at":235,"reading_minutes":62,"updated_at":235},"copyescape-cve-2026-17106-patch-docker-cp","CopyEscape (CVE-2026-17106): patch docker cp, and stop copying out of running containers","A race in docker cp lets a malicious container write files anywhere the copying process can write on the host. That matters for CI runners and AI-agent sandboxes that copy results out. Check your versions, patch, and change copy-out jobs to stop the container first.",[39,11,232,233,13],"cve","ci","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ac218ebfd770659725abe68-0-eee7c8f7.png","2026-10-04T23:51:14.689Z",{"slug":237,"title":238,"type":24,"summary":239,"tags":240,"author":14,"cover_url":242,"published_at":243,"reading_minutes":150,"updated_at":244},"protected-quick-tunnels-vs-tailscale-funnel","Share localhost with three named people: Cloudflare's Protected Quick Tunnels vs Tailscale Funnel","cloudflared 2026.9.3 adds --allowed-mail: your quick tunnel now sits behind an email one-time PIN, checked against an allow-list on your own machine, free and without a Cloudflare account. The commands, what it protects, and when Tailscale Serve or Funnel is the better fit.",[29,28,241,11,13],"tunnels","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6ac218d8fd770659725abe3a-0-40f8cb2e.png","2026-10-04T23:19:14.764Z","2026-10-04T23:19:14.765Z",{"slug":246,"title":247,"type":24,"summary":248,"tags":249,"author":14,"cover_url":255,"published_at":256,"reading_minutes":19,"updated_at":257},"si-domains-super-intelligence-data",".si after 'Super Intelligence': did one UN speech move a ccTLD?","Trump renamed AI 'super intelligence' at the UN on 22 September 2026 and Slovenia's .si went from about 190,000 names to almost 276,000 in a month. Registry numbers, prices, and 87 WHOIS checks: the obvious AI names were gone years ago; the compounds went in days.",[250,251,252,253,254,13],"domains","si","tld","data","ai","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abaaee53e21d5cbd14d442d-0-d6243bc5.png","2026-10-04T22:36:14.598Z","2026-10-04T22:36:14.599Z",{"slug":259,"title":260,"type":24,"summary":261,"tags":262,"author":14,"cover_url":267,"published_at":268,"reading_minutes":269,"updated_at":270},"palantir-agent-stack-python","Steal Palantir's agent stack: typed tools, one LLM gateway, swappable models","An X thread boils Palantir's AIP docs down to four agent patterns. We check each one against the docs, then build them in one stdlib-only Python file: typed business-object tools, a gateway that masks PII, caches and retries, a model set in config, and schedule\u002Fevent\u002FAPI triggers.",[12,263,264,265,266,13],"llm","python","architecture","palantir","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abd88f9c951ea7137fa3872-0-48eb7eee.png","2026-10-01T23:05:10.531Z",10,"2026-10-01T23:05:10.532Z",{"slug":272,"title":273,"type":24,"summary":274,"tags":275,"author":14,"cover_url":277,"published_at":278,"reading_minutes":279,"updated_at":280},"claude-code-effort-levels","Effort levels in Claude Code: when max effort pays off and when it just burns tokens","Anthropic's effort deep dive (Terminal-Bench 3.0 plus three builds) shows higher effort mostly buys verification and edge-case testing, not smarter code. A rule of thumb per task type, the commands to set effort, and a script to measure cost vs pass rate on your own repo.",[102,276,263,104,13],"ai-coding","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abd88edc951ea7137fa3804-0-2716005a.png","2026-10-01T22:32:14.139Z",9,"2026-10-02T04:44:58.001Z",{"slug":282,"title":283,"type":24,"summary":284,"tags":285,"author":14,"cover_url":288,"published_at":289,"reading_minutes":290,"updated_at":291},"agentic-inbox-cloudflare-setup","Self-host an AI email agent on Cloudflare Workers: agentic-inbox set up and costed","Cloudflare's open-source agentic-inbox runs a full email client on Workers, with one SQLite Durable Object per mailbox and a Kimi K2.5 agent that drafts replies. Covers the post-deploy steps people miss (Access, sending, routing, mailbox first) and the cost.",[29,286,12,287,38,13],"workers","email","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abd88dac951ea7137fa378b-0-5b0ec96d.png","2026-10-01T08:17:18.646Z",8,"2026-10-05T05:56:11.919Z",{"slug":293,"title":294,"type":24,"summary":295,"tags":296,"author":14,"cover_url":300,"published_at":301,"reading_minutes":290,"updated_at":302},"audit-ai-agent-public-traces","Nearly a million leaked links: auditing what your AI agents leave on the public web","OpenAI's agent swarm left almost a million public shortener URLs holding credentials. Here's a tested shell + gitleaks audit to find the shortlinks, pastes and webhooks your own agents created, scan them for secrets and close the channels.",[11,297,298,299,263,13],"agents","secrets","gitleaks","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abaad873e21d5cbd14d4397-0-0f4f51f7.png","2026-10-01T07:43:19.642Z","2026-10-01T08:44:43.041Z",{"slug":304,"title":305,"type":24,"summary":306,"tags":307,"author":14,"cover_url":311,"published_at":312,"reading_minutes":290,"updated_at":313},"mikrotrick-check-patch-mikrotik","MikroTrick: check and patch your MikroTik in 15 minutes","Two chained RouterOS bugs give anyone who can reach SSH full admin, no password needed, and attacks started before the patch. Find exposed SSH, check the version, grep for the published IoCs, patch and move management behind WireGuard.",[11,308,309,310,38,13],"mikrotik","routeros","ssh","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abcd9c0838b650cb96b3d10-0-6cd107e0.png","2026-10-01T07:02:15.03Z","2026-10-01T08:44:41.391Z",{"slug":315,"title":316,"type":24,"summary":317,"tags":318,"author":14,"cover_url":319,"published_at":320,"reading_minutes":290,"updated_at":321},"agent-sandbox-dns-egress-lockdown","Your agent sandbox leaks through DNS: lock down egress in 15 minutes","An OpenAI model escaped its sandbox by tunnelling questions through DNS. Here is a tested Docker Compose setup for coding agents: a DNS allowlist, a logging egress proxy and a kill switch that actually fires.",[11,39,297,190,38,13],"https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abaaca13e21d5cbd14d4306-0-cb93fe1b.png","2026-10-01T03:00:15.943Z","2026-10-01T08:44:43.165Z",{"slug":323,"title":324,"type":24,"summary":325,"tags":326,"author":14,"cover_url":330,"published_at":331,"reading_minutes":107,"updated_at":332},"who-blocks-ai-crawlers-robots-txt","Who blocks AI crawlers? robots.txt vs the network edge, with numbers","I scanned robots.txt on the top 300 sites: 33 of 138 block GPTBot, 14 block training but allow AI search. What each AI bot directive controls, why robots.txt is only a request, and a copy-paste policy plus nginx rule for small SaaS sites.",[254,327,328,29,329,13],"robots-txt","seo","saas","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abcd9c1838b650cb96b3d1b-0-11f94198.png","2026-09-30T21:00:20.673Z","2026-10-01T20:47:34.092Z",{"slug":334,"title":335,"type":24,"summary":336,"tags":337,"author":14,"cover_url":341,"published_at":342,"reading_minutes":150,"updated_at":343},"bullet-time-with-first-last-frame-video","Bullet time with first\u002Flast-frame video: orbiting a frozen moment from three stills","A freeze-frame camera orbit built from generated stills: one action shot, two camera-move angles, two first\u002Flast-frame clips between them, stitched and ping-ponged. The pipeline, the seams, and where the model re-imagines the water.",[254,338,339,340],"comfyui","video-generation","flowdsl","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abae46c45201648bfd477a7-0-6f4d036e.png","2026-09-28T22:42:41Z","2026-09-28T22:42:41.6Z",{"slug":345,"title":346,"type":24,"summary":347,"tags":348,"author":14,"cover_url":350,"published_at":351,"reading_minutes":107,"updated_at":352},"an-ai-media-pipeline-that-shows-its-work","An AI media pipeline that shows its work: ComfyUI presets, FlowDSL routing and the misses","How the images on my sites are generated: four ComfyUI presets behind one Go module, job rows as state, FlowDSL flows for routing, per-post media in the admin — and the bugs and model misses I hit shipping it. This post's own images were made the same way.",[254,340,338,349],"image-generation","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6aba8ba317ceba3543925be4-0-2f6b8a5c.png","2026-09-28T15:57:50Z","2026-10-01T20:47:34.327Z",{"slug":354,"title":355,"type":24,"summary":356,"tags":357,"author":14,"cover_url":359,"published_at":360,"reading_minutes":361,"updated_at":362},"openai-embeddings-python-mongodb","Transforming Text into Vectors: OpenAI Embeddings in Python","Learn how to generate text embeddings with the OpenAI API in Python to power semantic search, recommendations, and more. Includes practical examples with MongoDB integration and cost analysis.",[70,254,264,358],"mongodb","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abad0fa45201648bfd46c2d-0-2e60b732.png","2024-11-23T00:00:00Z",3,"2026-09-28T22:31:01.385Z",{"slug":364,"title":365,"type":24,"summary":366,"tags":367,"author":14,"cover_url":369,"published_at":370,"reading_minutes":371,"updated_at":372},"check-pricing-availability-ing-domains","Last Chance to Grab Short .ING Domains: The Extended List Part II","Welcome back to the second part of our exciting exploration into the .ING domain zone! This time, I've expanded our horizons to bring you an even larger selection of .ING domain names. List of over 24,000 domain names inside.",[250,368],"business","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abad0fa45201648bfd46c38-0-c55f4c8d.png","2023-12-14T00:00:00Z",1,"2026-09-28T22:31:01.453Z",{"slug":374,"title":375,"type":24,"summary":376,"tags":377,"author":14,"cover_url":378,"published_at":379,"reading_minutes":380,"updated_at":381},"impressive-ing-domains","Unveiling the Impressive .ING Domains","Discover the vast potential of the new .ING domain zone in my latest blog post! I've used AI and a Python script to unearth a treasure trove of available domain names. From budget-friendly picks to exclusive premium domains, there's something for every ambition. Plus, a special list of unique, lesser-known domains awaits.",[250,368],"https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abad0fa45201648bfd46c43-0-03be24b7.png","2023-12-11T00:00:00Z",2,"2026-09-28T22:31:01.527Z",{"slug":383,"title":384,"type":24,"summary":385,"tags":386,"author":14,"cover_url":388,"published_at":389,"reading_minutes":361,"updated_at":390},"secured-web-server-in-5-minutes","Fortify Web Server Security in 5 Minutes with Tailscale","Tailscale revolutionizes secure networking with its user-friendly approach, effortlessly connecting devices across diverse networks.",[157,28,387],"webserver","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abad0fa45201648bfd46c4e-0-eae6f62d.png","2023-11-03T00:00:00Z","2026-09-28T22:31:01.597Z",{"slug":392,"title":393,"type":24,"summary":394,"tags":395,"author":14,"cover_url":398,"published_at":399,"reading_minutes":19,"updated_at":400},"lets-encrypt-free-ssl","How to Secure Your Website with Free SSL Certificates for a Lifetime","Let’s Encrypt certificates have revolutionized internet security by providing free, automated, and widely trusted SSL\u002FTLS certificates. The non-profit Certificate Authority (CA) has significantly contributed to a more secure web environment by simplifying the process of securing websites with HTTPS.",[396,397,387],"ssl","https","https:\u002F\u002Fmedia.stufio.com\u002Fmedia\u002Fifcodes\u002Fmediagen\u002F6a\u002F6abad0fa45201648bfd46c59-0-bf2a9a0a.png","2023-11-01T00:00:00Z","2026-09-28T22:39:13.555Z"]