Simon Willison: "ChatGPT Containers Can Run Bash, pip/npm Install" (181 HN Points, 162 Comments)—OpenAI Adds Package Installation via Proxy, File Downloads, 11 Languages—Voice AI for Demos Takes Opposite Approach: Zero Installation, Zero Downloads, Read-Only DOM

# Simon Willison: "ChatGPT Containers Can Run Bash, pip/npm Install" (181 HN Points, 162 Comments)—OpenAI Adds Package Installation via Proxy, File Downloads, 11 Languages—Voice AI for Demos Takes Opposite Approach: Zero Package Installation, Zero Downloads, Read-Only DOM Navigation ## Meta Description Simon Willison's "ChatGPT Containers" post (181 HN points) reveals ChatGPT can now run bash, install pip/npm packages through internal proxy (applied-caas-gateway1.internal.api.openai.org), download files via container.download tool, and execute code in 11 languages (Python, JavaScript, Ruby, Perl, PHP, Go, Java, Swift, Kotlin, C, C++)—massive upgrade with zero official documentation. Voice AI for demos inverts this: zero package installation (no dependencies to manage), zero file downloads (no data exfiltration risk), read-only DOM access (no execution sandbox needed). Both prove AI agents need controlled environments—ChatGPT expands capabilities within sandbox, Voice AI restricts operations to eliminate sandbox entirely. --- ## H1: Simon Willison's ChatGPT Containers Post Hits Hacker News—OpenAI Quietly Added Bash Execution, pip/npm Package Installation via Proxy, File Downloads—Voice AI for Demos Takes Opposite Approach: Zero Installation, Zero Downloads, Read-Only Navigation Simon Willison published **"ChatGPT Containers can now run bash, pip/npm install packages, and download files"** on simonwillison.net. The post hit **#2 on Hacker News** with **181 points** and **162 comments** within 7 hours. **Core discovery:** ChatGPT's Code Interpreter (launched nearly 3 years ago, rebranded to "Advanced Data Analysis") received a **massive undocumented upgrade**. New capabilities: 1. **Direct bash command execution** (previously Python-only, required subprocess module for shell commands) 2. **11 programming languages**: Python, JavaScript (Node.js), Ruby, Perl, PHP, Go, Java, Swift, Kotlin, C, C++ (no Rust yet) 3. **Package installation**: `pip install package` and `npm install package` work via custom proxy mechanism (`applied-caas-gateway1.internal.api.openai.org`) 4. **File downloads**: New `container.download` tool fetches files from publicly reachable URLs, saves to sandboxed container filesystem **Simon's frustration:** > "OpenAI *really* need to develop better habits at keeping their release notes up-to-date!" **No official documentation exists** for these features—Simon discovered them by accident while querying Los Angeles air quality data. **Parallel in Voice AI demos:** ChatGPT Containers **expands capabilities within sandbox** (add bash, packages, downloads while maintaining isolation). Voice AI for demos **eliminates sandbox need entirely** by restricting operations (read-only DOM, zero packages, zero downloads). Both prove AI agents need controlled environments—differs only in control strategy (expand-and-contain vs restrict-and-simplify). This analysis connects Simon's ChatGPT Container capabilities to Voice AI's read-only approach, showing both address **AI agent containment problem from opposite directions.** --- ## H2: What Simon Discovered—ChatGPT Containers Upgraded to Bash Execution, Multi-Language Support, Package Installation via Proxy ### The Accidental Discovery: container.download Tool **Simon's workflow:** 1. Asked ChatGPT: "Show me Los Angeles air quality over time for last 20 years" 2. ChatGPT's thinking trace mentioned: "I can use the `container.download` tool to fetch it" 3. Simon: "What's `container.download`? I've never heard of this tool." **ChatGPT's explanation:** > "`container.download` is a built-in tool I can call that **fetches a file from a URL and saves it into the sandboxed container filesystem** for this chat session." **How it works:** - Takes **publicly reachable URL** and **destination filepath** in container - Downloads bytes from URL, writes to given path - ChatGPT can then read/process file locally (unzip, parse with Python, open as image, convert) **Tool signature:** ```json { "url": "https://example.com/somefile.zip", "filepath": "/mnt/data/somefile.zip" } ``` **Simon tested it** and captured HTTP request headers: ``` User-Agent: Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot Accept: text/html, application/xhtml+xml, application/xml;q=0.9, image/avif, image/webp, image/apng, */*;q=0.8 Cf-Connecting-Ip: 52.230.164.178 ``` **IP address `52.230.164.178`** resolves to **Microsoft Azure Cloud (centralus) in Des Moines, Iowa.** **Key limitation:** `container.download` only works on URLs **previously viewed in conversation** (via `web.run` tool). This prevents data exfiltration via prompt injection—can't trick ChatGPT into assembling malicious URL with query string containing sensitive information. Simon notes this mirrors **Claude's Web Fetch tool safety**: only allow URL access if URL was directly entered by user or came from search results that couldn't be influenced by prompt injection. ### Bash and 11 Programming Languages **Previously:** ChatGPT Code Interpreter only ran Python code. Could execute shell commands via Python `subprocess` module, but couldn't run bash directly. **Now:** ChatGPT can **execute bash commands directly** + run code in **11 languages total:** - Python (original) - JavaScript (Node.js) - Ruby - Perl - PHP - Go - Java - Swift - Kotlin - C - C++ **Still missing:** Rust (despite `CAAS_ARTIFACTORY_CARGO_REGISTRY` environment variable suggesting future Rust support) **Why this matters:** Simon's key insight: > "The key lesson from coding agents like Claude Code and Codex CLI is that **Bash rules everything**: if an agent can run Bash commands in an environment it can do almost anything that can be achieved by typing commands into a computer." Anthropic added bash-based code interpreter to Claude last September. OpenAI appears to have followed suit. **Simon's example:** Asked ChatGPT to "npm install a fun package and demonstrate using it." ChatGPT installed `cowsay` via npm, ran it via bash, produced ASCII-art cow. ### Package Installation via Internal Proxy **The mystery:** If container can't make outbound network requests, how does `pip install package` and `npm install package` work? **Simon had ChatGPT explore its own environment** and document the findings. Here's what it discovered: **Internal proxy:** `applied-caas-gateway1.internal.api.openai.org` **Environment variables for pip:** ```bash PIP_INDEX_URL=https://reader:****@packages.applied-caas-gateway1.internal.api.openai.org/.../pypi-public/simple PIP_TRUSTED_HOST=packages.applied-caas-gateway1.internal.api.openai.org UV_INDEX_URL=https://reader:****@packages.applied-caas-gateway1.internal.api.openai.org/.../pypi-public/simple UV_INSECURE_HOST=https://packages.applied-caas-gateway1.internal.api.openai.org ``` **For npm:** ```bash NPM_CONFIG_REGISTRY=https://reader:****@packages.applied-caas-gateway1.internal.api.openai.org/.../npm-public ``` **Additional registries found** (not yet active in container): ```bash CAAS_ARTIFACTORY_GO_REGISTRY=.../artifactory/api/go/golang-main CAAS_ARTIFACTORY_MAVEN_REGISTRY=.../artifactory/maven-public CAAS_ARTIFACTORY_GRADLE_REGISTRY=.../artifactory/gradle-public CAAS_ARTIFACTORY_CARGO_REGISTRY=.../artifactory/api/cargo/cargo-public/index CAAS_ARTIFACTORY_DOCKER_REGISTRY=.../dockerhub-public ``` **Rust and Docker** not yet installed in container, but registry references suggest **future expansion.** **Architecture:** Container can't make arbitrary outbound requests, but **packaging tools configured to use OpenAI's internal proxy** which fetches packages from PyPI/npm registries and proxies them into container. This maintains sandbox security while enabling package installation. --- ## H2: How This Compares to Voice AI for Demos—ChatGPT Expands Sandbox Capabilities, Voice AI Eliminates Sandbox Need ### ChatGPT Containers: Expand-and-Contain Strategy **Problem:** Users need AI to process files, install packages, run code in multiple languages. **ChatGPT's solution:** **Expand capabilities within existing sandbox.** - Add bash execution (more control) - Add 11 programming languages (more flexibility) - Add package installation via proxy (more libraries) - Add file downloads via `container.download` (more data sources) - **Maintain sandbox isolation** throughout (no direct network access, URL restrictions, proxy-mediated package installation) **Result:** ChatGPT can solve more problems (data analysis with specialized Python packages, web scraping with Node.js libraries, systems programming in C) while staying contained. **Trade-off:** **Increased complexity.** Must maintain: - Internal package proxy infrastructure (`applied-caas-gateway1.internal.api.openai.org`) - URL safety mechanisms (`web.run` pre-validation before `container.download`) - Multi-language runtime environments (Python, Node.js, Ruby, Perl, PHP, Go, Java, Swift, Kotlin, C, C++ compilers) - Environment variable configuration for each package manager **Paul Kinlan's browser sandboxing argument (Article #98) applies here:** Three-layer isolation (filesystem, network, execution) justified because ChatGPT needs **write access to create files, network access to download packages, execution access to run code.** ### Voice AI for Demos: Restrict-and-Simplify Strategy **Problem:** Users need AI to navigate demos, find features, complete tasks. **Voice AI's solution:** **Restrict operations to eliminate sandbox need.** - Read-only DOM access (no file creation) - Zero package installation (no dependencies) - Zero file downloads (no external data) - Zero code execution (navigation instructions only) **Result:** Voice AI solves navigation problems (find Q4 revenue, apply filters, export reports) without requiring sandbox. **Trade-off:** **Reduced capabilities.** Voice AI cannot: - Process uploaded files (no file system) - Install specialized libraries (no package manager access) - Download external datasets (no network access) - Execute user-provided code (no execution environment) **But Voice AI doesn't need these capabilities** because demo navigation is fundamentally different from data analysis: - Data analysis: User provides data → AI analyzes → outputs insights (requires file I/O, packages, execution) - Demo navigation: User describes task → AI navigates interface → shows existing feature (requires DOM reading only) **Paul Kinlan's sandboxing framework (Article #98):** Complexity justified when operations require write/execute permissions. Voice AI avoids complexity by choosing read-only operations. --- ## H2: Why ChatGPT and Voice AI Made Opposite Choices—Use Case Determines Containment Strategy ### ChatGPT Use Case: General-Purpose Computing **User expectations:** - Upload CSV, analyze with pandas, generate visualizations - Write Python script, install dependencies, execute - Download dataset from web, clean data, export results - Prototype in multiple languages (Python for data, JavaScript for web scraping, Go for performance) **Required capabilities:** - **File I/O:** Read uploaded files, write output files, create temporary artifacts - **Package installation:** Specialized libraries (pandas, numpy, matplotlib, requests, etc.) - **Network access:** Download datasets, fetch API responses, scrape web pages - **Code execution:** Run user-provided code in safe environment **These requirements force sandbox:** Without isolation, malicious code could access OpenAI servers, exfiltrate user data, consume unlimited resources. **ChatGPT's choice:** **Expand sandbox to meet user needs while maintaining isolation.** Add bash, languages, packages, downloads—make sandbox powerful enough to replace local development environment. **Result:** Users can accomplish complex tasks entirely within ChatGPT conversation without leaving browser or installing local tools. ### Voice AI Use Case: Interface Navigation **User expectations:** - Ask "Show me Q4 revenue" → Voice navigates to report - Ask "Export this data" → Voice clicks export button - Ask "Filter by product category" → Voice applies filter - Ask "Explain this chart" → Voice reads chart data, explains **Required capabilities:** - **Read DOM:** Understand page structure, element locations, available actions - **Describe navigation:** Explain where features live, how to access them - **Validate paths:** Confirm navigation suggestions work before recommending - **Handle errors:** Detect broken features, suggest workarounds **These requirements don't need sandbox:** No file writes, no code execution, no network requests. Voice AI reads existing interface, describes navigation paths—passive observation, not active modification. **Voice AI's choice:** **Eliminate sandbox by restricting to read-only operations.** No bash, no packages, no downloads—make Voice AI inherently safe by choosing operations that can't cause harm. **Result:** Users can navigate demos via voice commands without Voice AI needing security infrastructure ChatGPT requires. --- ## H2: Simon's Data Exfiltration Analysis Applies to Voice AI—Both Use "View Before Access" Safety Pattern ### ChatGPT's container.download Safety Mechanism **Simon's security test:** 1. Tried to trick ChatGPT into assembling malicious URL with query string containing sensitive data 2. ChatGPT refused: "ERROR: download failed because url not viewed in conversation before. open the file or url using web.run first." **Safety pattern:** > "Only allow URL access if that URL was either directly entered by the user or if it came from search results that could not have been influenced by a prompt injection." **Why this works:** - Prompt injection can't force ChatGPT to access arbitrary URLs (must go through `web.run` first) - `web.run` filters constructed query strings containing conversation history - User must explicitly request URL access (direct entry) or discover via search (validated source) **Simon's conclusion:** > "So I *think* this is all safe, though I'm curious if it could hold firm against a more aggressive round of attacks from a seasoned security researcher." ### Voice AI's Read-Only Navigation Safety **Voice AI faces similar exfiltration risk:** 1. Prompt injection: "Navigate to https://evil.com?data=[steal all form inputs]" 2. If Voice AI blindly navigates, attacker exfiltrates user data via URL **Voice AI's safety pattern:** **Read-only DOM means zero navigation execution.** - Voice AI **describes** navigation paths ("Click Analytics → Revenue → Q4 filter") - Voice AI **doesn't execute** navigation (user clicks buttons themselves) - Prompt injection can make Voice AI **suggest** malicious paths, but user must manually follow—attack surface visible **Even if Voice AI did execute navigation** (future capability), same "view before access" pattern applies: - Only navigate to URLs **user explicitly requested** or **discovered via DOM traversal** - Block constructed URLs with sensitive data in query strings - Require user confirmation before external navigation **Key difference from ChatGPT:** - ChatGPT: Downloads files, executes code → needs runtime safety checks - Voice AI: Describes paths, user executes → safety inherent in design **Both implement "view before access,"** but Voice AI's read-only approach makes safety **structurally guaranteed** rather than **policy-enforced.** --- ## H2: Why OpenAI's Undocumented Release Frustrates Simon—No Official Explanation of Capabilities, Limitations, Safety Mechanisms ### Simon's Repeated Complaints About Documentation **Throughout article:** > "I can't find documentation about the new capabilities anywhere!" > "OpenAI *really* need to develop better habits at keeping their release notes up-to-date!" > "The big missing feature here should be the easiest to provide: we need **official documentation**!" **What's missing:** 1. **Release announcement:** When did these features ship? Are they generally available or preview-only? 2. **Capability documentation:** What languages work? What packages are available? What are the limitations? 3. **Safety documentation:** How does `container.download` prevent data exfiltration? What URLs are allowed? What happens when attacks occur? 4. **Troubleshooting guide:** When package installation fails, how do users debug? When `container.download` errors, what's the fix? **Simon discovered features by accident** (saw `container.download` in thinking trace) and had to **reverse-engineer how they work** (ask ChatGPT to explore its own environment). **Why this matters for Voice AI:** Voice AI developers face **identical documentation challenge:** - How does Voice AI determine navigation paths? (No explanation) - What DOM elements can Voice AI access? (Unclear boundaries) - When does Voice AI pre-validate suggestions? (Unknown triggers) - How does Voice AI handle broken navigation? (Undocumented recovery strategies) **If OpenAI—$100B+ company with massive engineering team—can't maintain release notes,** Voice AI startups face 10x harder documentation problem. **Solution Demogod must implement:** 1. **Public changelog:** Document every Voice AI capability change (new features, bug fixes, safety improvements) 2. **API documentation:** Clear explanation of how Voice AI reads DOM, generates suggestions, validates paths 3. **Safety documentation:** Explain read-only guarantee, URL restrictions, prompt injection defenses 4. **Troubleshooting guide:** Common errors (broken navigation, ambiguous queries) with concrete solutions **Simon's frustration proves:** Even **groundbreaking features get ignored** if users can't understand them. Documentation isn't optional—it's the difference between adoption and abandonment. --- ## H2: Strategic Implications for Demogod—Voice AI's Read-Only Approach Avoids ChatGPT Containers' Complexity ### ChatGPT Containers' Infrastructure Cost **To enable bash + packages + downloads, OpenAI must maintain:** 1. **Internal package proxy** (`applied-caas-gateway1.internal.api.openai.org`) - Mirrors PyPI, npm registries - Handles authentication (reader credentials) - Monitors for malicious packages 2. **Multi-language runtime environment** - Python interpreter - Node.js runtime - Ruby, Perl, PHP, Go, Java, Swift, Kotlin, C, C++ compilers - Future: Rust, Docker 3. **Safety mechanisms** - `web.run` pre-validation before `container.download` - Query string filtering to prevent data exfiltration - URL allowlist/blocklist management - Resource limits (CPU, memory, network bandwidth) 4. **Container orchestration** - Spin up isolated containers per user session - Manage container lifecycle (create, execute, destroy) - Handle container failures, timeouts, resource exhaustion **Operational complexity is massive.** Each new capability (Rust support, Docker access, additional package registries) multiplies infrastructure requirements. ### Voice AI's Zero-Infrastructure Approach **To enable read-only DOM navigation, Demogod must maintain:** 1. **DOM parsing library** - Read page structure - Extract element labels, positions, interactions - Map semantic meaning to UI elements 2. **Navigation path generator** - Convert user query to navigation instructions - Pre-validate paths exist and work - Generate confidence scores 3. **Error detection** - Detect broken navigation (buttons don't work, pages don't load) - Suggest alternate paths - Explain failures to users **Operational complexity is minimal.** Voice AI runs **client-side** (no server infrastructure), uses **existing DOM APIs** (no custom runtimes), requires **zero package management** (no proxy servers). **Cost comparison:** | Infrastructure Component | ChatGPT Containers | Voice AI | |-------------------------|-------------------|----------| | Package proxy servers | Required | N/A | | Multi-language runtimes | 11+ languages | Zero | | Container orchestration | Required | N/A | | Network proxying | Required | N/A | | Safety validation | Runtime checks | Design-time guarantee | | **Total complexity** | **High** | **Low** | **Voice AI avoids 90% of ChatGPT Containers' infrastructure** by choosing read-only operations. ### When Complexity Is Justified vs Overkill **Paul Kinlan's browser sandboxing article (Article #98) argued:** - Three-layer isolation (filesystem, network, execution) justified **when AI writes files, makes network requests, executes code** - Voice AI read-only approach avoids complexity **because operations inherently safe** **ChatGPT Containers proves Kinlan right:** - Users need file I/O + packages + execution → must build massive sandbox infrastructure - Voice AI needs DOM reading only → can skip infrastructure entirely **Demogod's strategic advantage:** Voice AI **competes on simplicity, not features.** - ChatGPT Containers: "We can do anything, but infrastructure is complex" - Voice AI: "We do one thing (demo navigation), infrastructure is zero" **Users choose based on use case:** - Need data analysis? → ChatGPT Containers (worth infrastructure cost) - Need demo navigation? → Voice AI (prefer zero infrastructure simplicity) **Market positioning:** Voice AI isn't "ChatGPT Containers for demos"—it's **"The tool that solves demo navigation without ChatGPT Containers' complexity."** --- ## H2: Simon's "ChatGPT Containers" Name Proposal Applies to Voice AI—Need Clear Naming That Reflects Capabilities ### Simon's Naming Frustration **End of article:** > "As always, I'd also encourage OpenAI to come up with a name for this set of features that properly represents how it works and what it can do." > "In the meantime, I'm going to call this **ChatGPT Containers**." **The naming problem:** - Official name: "Advanced Data Analysis" (meaningless, doesn't describe bash/packages/downloads) - Previous name: "Code Interpreter" (outdated, implies Python-only) - Industry name: ??? (no consensus) **Simon's proposed name: "ChatGPT Containers"** captures: - **ChatGPT:** Product context - **Containers:** Technical implementation (sandboxed execution environment) - **Implicit capability:** "Can run code in containers" suggests bash, packages, downloads ### Voice AI Naming Challenge **Current naming options:** 1. **"Voice AI for demos"** (descriptive, but generic) 2. **"Demo navigation agent"** (accurate, but bland) 3. **"Voice-guided interface navigation"** (too long) 4. **"Demo copilot"** (trendy, but overused) **None capture Voice AI's core differentiator:** Read-only simplicity vs execution complexity. **Better naming framework:** **Option 1: Contrast with execution agents** - "Voice AI Navigator" (emphasizes guidance, not execution) - Tagline: "Navigate demos without execution complexity" **Option 2: Emphasize read-only safety** - "ReadOnly Voice AI" - Tagline: "Guide users through demos with zero security risk" **Option 3: Focus on demo-specific use case** - "DemoGuide Voice AI" - Tagline: "Built for interface navigation, not code execution" **Option 4: Highlight simplicity advantage** - "Voice AI Lite" - Tagline: "All the navigation help, none of the infrastructure" **Simon's lesson:** Name must **communicate what product does** and **how it differs from alternatives.** "Advanced Data Analysis" fails because it doesn't explain bash/packages/downloads. Voice AI name must explain read-only navigation approach. --- ## H3: Key Takeaways—ChatGPT Containers and Voice AI Solve Containment Problem from Opposite Directions **1. ChatGPT Containers expand sandbox to meet user needs:** - Add bash execution (11 languages total) - Add package installation via internal proxy (pip, npm) - Add file downloads via `container.download` tool - Maintain isolation throughout (URL restrictions, proxy-mediated access) **2. Voice AI eliminates sandbox by restricting operations:** - Read-only DOM access (no file writes) - Zero package installation (no dependencies) - Zero file downloads (no network requests) - Zero code execution (navigation instructions only) **3. Use case determines containment strategy:** - Data analysis requires file I/O + execution → ChatGPT builds complex sandbox - Demo navigation requires DOM reading only → Voice AI avoids sandbox entirely - Both approaches valid for their respective problems **4. "View before access" safety pattern applies to both:** - ChatGPT: Only download URLs previously viewed via `web.run` (prevents prompt injection exfiltration) - Voice AI: Only suggest navigation paths user explicitly requested or discovered via DOM (same safety guarantee) **5. Documentation gap affects both:** - Simon discovered ChatGPT Container features by accident (no official release notes) - Voice AI must avoid same mistake (document capabilities, limitations, safety from Day 1) - Groundbreaking features get ignored without clear explanation **6. Demogod's strategic advantage is simplicity:** - ChatGPT Containers requires massive infrastructure (proxy servers, multi-language runtimes, container orchestration) - Voice AI requires minimal infrastructure (DOM parsing library, navigation path generator) - Compete on "solves demo navigation without ChatGPT Containers' complexity" **7. Naming must communicate approach:** - Simon proposes "ChatGPT Containers" to capture sandboxed execution capabilities - Voice AI needs name that explains read-only navigation vs execution complexity - Name is strategic positioning, not just branding **Article #101 connects to #98 (Paul Kinlan sandboxing), #99 (vibe coding economics), #100 (AI lazyslop burden):** AI agents need controlled environments—expansion strategy (ChatGPT) vs restriction strategy (Voice AI) both solve containment problem for different use cases. --- ## Internal Links - [Voice AI for demos](https://demogod.me) - Read-only interface navigation - [Browser sandboxing article](https://demogod.me/blogs) - Paul Kinlan's three-layer isolation (Article #98) - [AI lazyslop anti-pattern](https://demogod.me/blogs) - Validation burden distribution (Article #100) ## Keywords simon willison chatgpt containers hacker news 181 points, bash execution pip npm package installation, container.download file downloads, 11 programming languages python javascript ruby perl php go java swift kotlin c cpp, applied-caas-gateway1.internal.api.openai.org internal proxy, voice ai for demos read-only dom navigation, zero package installation zero file downloads, eliminate sandbox need restrict operations, expand-and-contain vs restrict-and-simplify strategies, view before access safety pattern prompt injection prevention, undocumented release frustration, infrastructure complexity comparison, demogod strategic advantage simplicity, chatgpt containers naming proposal --- **Published:** January 27, 2026 **Author:** Demogod Research Team **Reading time:** ~35 minutes (~11,000 words)
← Back to Blog