Browser Steel
Use Steel CLI first. Use the Python runtime only when the workflow needs selector-heavy custom logic that is awkward to express through raw CLI steps.
What CLI means here
CLI means Command Line Interface.
In this skill, it specifically means the Steel terminal commands themselves, for example:
steel scrape https://example.com
steel browser start --session demo
steel browser open https://example.com --session demo
steel browser snapshot -i --session demo
The wrapper script does not replace Steel CLI. It packages it into a more publishable, agent-friendly entrypoint:
python3 {baseDir}/scripts/main.py scrape --url https://example.com
python3 {baseDir}/scripts/main.py start-session --session demo
python3 {baseDir}/scripts/main.py browser --session demo -- snapshot -i -c
So the relationship is:
- Steel CLI = the underlying browser command system
scripts/main.py= the wrapper that calls Steel CLI by default- Python runtime = a fallback path for custom Playwright logic when CLI steps are not enough
First checks
- Run the doctor command before the first real task in a new environment:
python3 {baseDir}/scripts/main.py doctor - Prefer stateless commands for one-shot extraction or capture.
- Prefer named sessions for multi-step interaction.
- Keep the same
--sessionvalue across every step in one workflow. - Never bake private cookies, profile names, or local paths into the skill itself.
Runtime selection
auto: prefer installedsteel, otherwise fall back tonpx @steel-dev/clicli: same asauto, but fail if no CLI path is availablenode: force the Node-distributed CLI path throughnpx @steel-dev/clipython: use Steel SDK + Playwright throughrun-python-plan
Read references/runtime-modes.md only when runtime choice or env resolution matters.
Read references/official-docs.md when you need the authoritative Steel CLI or Playwright-Python upstream reference.
Preferred commands
Health check
python3 {baseDir}/scripts/main.py doctor
Stateless commands
python3 {baseDir}/scripts/main.py scrape --url https://example.com --format markdown --json
python3 {baseDir}/scripts/main.py screenshot --url https://example.com --full-page --json
python3 {baseDir}/scripts/main.py pdf --url https://example.com --json
Named-session workflow
python3 {baseDir}/scripts/main.py start-session --session demo --stealth --json
python3 {baseDir}/scripts/main.py browser --session demo -- open https://example.com
python3 {baseDir}/scripts/main.py browser --session demo -- snapshot -i -c
python3 {baseDir}/scripts/main.py browser --session demo -- fill @e2 "hello"
python3 {baseDir}/scripts/main.py browser --session demo -- click @e5
python3 {baseDir}/scripts/main.py browser --session demo -- wait --load-state networkidle
python3 {baseDir}/scripts/main.py stop-session --session demo --json
Python Playwright plan
python3 {baseDir}/scripts/main.py run-python-plan \
--plan-file {baseDir}/references/example-plan.json \
--url https://example.com
Read references/python-plan.md only when the CLI path is insufficient.
Guardrails
- Start with
scrape,screenshot, orpdfwhen the task is stateless. - For interactive workflows, follow
start-session -> browser commands -> stop-session. - After any navigation or meaningful DOM change, take a fresh
snapshot -ibefore using another@eNref. - Keep secrets in env vars or an explicit
--env-file, not in the skill files. - Pass cookies only through
--cookies-fileorSTEEL_BROWSER_COOKIES_FILE. - Use the Python runtime only for tasks that genuinely benefit from custom Playwright logic.
- Record confirmed improvements in
maintenance.log.
References
references/official-docs.md— upstream Steel CLI and Playwright-Python referencesreferences/runtime-modes.md— runtime choice, env loading, and privacy rulesreferences/cli-workflows.md— reliable Steel CLI patternsreferences/python-plan.md— JSON plan schema and supported actionsreferences/troubleshooting.md— install/auth/runtime recovery