@false00/pi-steel
Fork of @steel-experiments/pi-steel — Steel browser automation extension for Pi
Package details
Install @false00/pi-steel from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@false00/pi-steel- Package
@false00/pi-steel- Version
0.1.16- Published
- Jun 12, 2026
- Downloads
- 1,014/mo · 1,014/wk
- Author
- false00
- License
- MIT
- Types
- extension
- Size
- 328.4 KB
- Dependencies
- 2 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./dist/index.js"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@false00/pi-steel
Fork of
@steel-experiments/pi-steelby nibzard and the Steel Experiments team. All credit for the original work belongs to them.
| Upstream | This fork | |
|---|---|---|
| npm | @steel-experiments/pi-steel |
@false00/pi-steel |
| GitHub | github.com/steel-dev/pi-steel | github.com/false00/pi-steel |
| Pi registry | @steel-experiments/pi-steel |
— |
Steel browser automation tools for the Pi coding agent.
This package publishes the Steel extension as a reusable Pi package so it can be installed directly into Pi or consumed by other runtimes such as Takopi-based wrappers.
Changes from upstream
.envfile support —~/.config/steel/.envis read as the highest-priority config source forapi_keyandbase_url. Auto-created on first run with discovered values so you don't have to set env vars every time.- Tool output paths —
steel_screenshot,steel_computer, andsteel_scrapeall append\nPath: {absolute-path}to their visible text output so the LLM canreadthe artifact directly. Upstream hid these paths indetailsmetadata that the agent never sees. steel_scrapesaves full content to disk — the untruncated scraped content is written to~/.cache/.steel-browser/scrapes/before the inline output is trimmed. When the response shows[truncated N chars], the LLM canreadthe file for the complete content.- Artifact directories moved — screenshots and PDFs are saved under
~/.cache/.steel-browser/instead of$CWD/.artifacts/, keeping build artifacts out of project directories.
Quick start
pi install npm:@false00/pi-steel
Then just ask Pi to browse:
> Go to hacker news and find the top story
Pi will use steel_navigate to open the page, steel_screenshot/steel_scrape to read the content, and return what it finds. All session management happens automatically.
Tools
Navigation
| Tool | Description |
|---|---|
steel_navigate |
Open a URL with automatic scheme normalization and retry logic |
steel_go_back |
Navigate back in browser history |
steel_get_url |
Read the current page URL |
steel_get_title |
Read the current page title |
Content extraction
| Tool | Description |
|---|---|
steel_scrape |
Extract page content as text, markdown, or html (full content saved to disk with path in output) |
steel_screenshot |
Capture a screenshot artifact (path in output) |
steel_pdf |
Generate a PDF artifact |
steel_extract |
Extract structured data using a JSON schema |
Interaction
| Tool | Description |
|---|---|
steel_click |
Click an element with captcha recovery |
steel_type |
Type text into a field |
steel_fill_form |
Fill multiple form fields at once |
steel_scroll |
Scroll the page or a nested container |
steel_find_elements |
Find interactive elements by selector |
steel_wait |
Wait for an element to appear |
steel_computer |
Low-level computer action with screenshot (path in output) |
Session management
| Tool | Description |
|---|---|
steel_pin_session |
Keep the browser session alive across prompts |
steel_release_session |
Close the browser and reset to default session mode |
steel_scrape defaults to text. Ask for markdown when headings, lists, and links matter. Ask for html only when raw DOM markup is actually needed.
Every steel_scrape call saves the full content to ~/.cache/.steel-browser/scrapes/ and includes the file path in the tool output. If the inline response is truncated, the LLM can read the file to get the complete content.
steel_scroll can scroll the page or a nested container. For apps like Google Maps, pass a selector for the results pane instead of relying on window scrolling.
Install
Install into Pi as a package:
pi install npm:@false00/pi-steel
Or load it for a single run:
pi -e npm:@false00/pi-steel
For local development from this repo:
pi -e .
Session modes
Steel sessions have a lifecycle tied to how Pi uses them. The default works for most cases, but you can tune it:
| Mode | Behavior |
|---|---|
agent (default) |
One session per Pi prompt, closed after agent_end |
session |
Session stays alive until Pi switches or shuts down |
turn |
Session closed after each Pi turn — aggressive, can break multi-step workflows |
Set the mode via environment variable:
STEEL_SESSION_MODE=session pi -e npm:@false00/pi-steel
You can also change session persistence at runtime with steel_pin_session and steel_release_session.
Configuration
Required
- Node.js 20+
- A Pi runtime that supports extensions
- Steel authentication via one of:
.envfile in~/.config/steel/(highest priority), orSTEEL_API_KEY, orsteel loginconfig in~/.config/steel/config.json
You can also create a ~/.config/steel/.env file to set your API key and base URL:
api_key=your-steel-api-key
base_url=https://your-selfhosted-steel-instance.com
Values in this file take precedence over all other configuration sources, including environment variables and constructor parameters.
Environment variables
Connection
| Variable | Purpose |
|---|---|
~/.config/steel/.env |
api_key and base_url values (highest priority) |
STEEL_BASE_URL |
Steel API base URL |
STEEL_BROWSER_API_URL |
Browser API endpoint |
STEEL_LOCAL_API_URL |
Local Steel instance URL |
STEEL_API_URL |
Alternative API URL |
STEEL_CONFIG_DIR |
Custom config directory |
Session
| Variable | Purpose |
|---|---|
STEEL_SESSION_MODE |
Lifecycle mode: agent, session, or turn |
STEEL_SESSION_TIMEOUT_MS |
Session timeout |
STEEL_SESSION_HEADLESS |
Run browser headless |
STEEL_SESSION_REGION |
Browser region |
STEEL_SESSION_PROFILE_ID |
Persistent browser profile |
STEEL_SESSION_PERSIST_PROFILE |
Save profile changes |
STEEL_SESSION_CREDENTIALS |
Session credentials |
STEEL_SESSION_NAMESPACE |
Session namespace |
Proxy
| Variable | Purpose |
|---|---|
STEEL_USE_PROXY |
Enable proxy |
STEEL_PROXY_URL |
Proxy URL |
Captcha
| Variable | Purpose |
|---|---|
STEEL_SOLVE_CAPTCHA |
Enable captcha solving |
STEEL_CAPTCHA_MAX_RETRIES |
Max captcha retry attempts |
STEEL_CAPTCHA_WAIT_MS |
Captcha solve wait time |
STEEL_CAPTCHA_POLL_INTERVAL_MS |
Captcha poll interval |
Tools
| Variable | Purpose |
|---|---|
STEEL_TOOL_TIMEOUT_MS |
Default tool timeout |
STEEL_NAVIGATE_RETRY_COUNT |
Navigation retry attempts |
pi-steel reads Steel CLI config for auth and local API resolution, and it normalizes CLI-style API URLs such as http://localhost:3000/v1 to the SDK-compatible base URL form.
Development
npm install
npm run build # requires tsconfig.json — only if you have TS source
npm test # requires tsconfig.json — may not work in this fork
Publishing
This fork's dist/ is the source of truth (no TS source files). The npm test and prepublishOnly scripts require a tsconfig.json that doesn't exist in this repo, so publish with --ignore-scripts.
# 1. Bump version and create git tag
npm version patch # or minor / major
# 2. Verify package contents
npm pack --dry-run
# 3. Publish (skips broken prepublishOnly script)
npm publish --ignore-scripts
If 2FA is enabled, npm will prompt you to authenticate in the browser before publishing.
The package manifest in package.json exposes the compiled extension entrypoint via pi.extensions, which lets Pi load the package root directly after install.
License
MIT — same as upstream. Original work copyright (c) 2026 Steel (nibzard & Steel Experiments contributors).