browseable
browseable is a Unix-style CLI backed by a local daemon that keeps browser sessions alive between commands.
What it does
- API 1 (
elements): given a session, list interactable form/navigation elements. - API 2 (
action): given a session, perform an action (click,type, orinteract).
The daemon holds browser + page state so each CLI command is short-lived.
Install
uv sync
uv run playwright install chromium
Quick start
# Optional convenience.
alias browseable='uv run browseable'
# 1) start daemon
browseable daemon start
# 2) create a session (returns session ID)
browseable session create https://example.com/signup
# 3) list elements for that session
browseable elements <session_id>
# 4) focus an element
browseable action <session_id> click 2
# 5) type into an element
browseable action <session_id> type 3 "my@email.com"
# 6) open interactive browser window for the same session
browseable action <session_id> interact
# 7) close session + stop daemon
browseable session close <session_id>
browseable daemon stop
Commands
browseable daemon start|run|status|stop
browseable session create <url>
browseable session close <session_id>
browseable elements <session_id> [--json]
browseable action <session_id> click <element_or_index> [--timeout-ms]
browseable action <session_id> type <element_or_index> <text> [--timeout-ms]
browseable action <session_id> interact [--timeout-ms]
interact focuses the session in a real browser window. If daemon started headless, interact promotes the session into a headed browser context.
BROWSEABLE_DAEMON_URL can override the daemon address if needed.
Daemon JSON API
The daemon exposes local HTTP endpoints:
POST /sessionswith{"url":"..."}-> create session.GET /sessions/<session_id>/elements-> list interactable elements.POST /sessions/<session_id>/actionswith{"action":"click"|"type","element_id":"...","text":"..."}.POST /sessions/<session_id>/actionswith{"action":"interact"}-> promote/focus session in a headed browser window.DELETE /sessions/<session_id>-> close session.
E2E Example
Run the telemetry register flow:
uv run scripts/e2e_telemetry_register.sh
GitHub Workflows
/.github/workflows/ci.yml: compile + CLI smoke checks onpush/pull_request./.github/workflows/publish-testpypi.yml: manual publish to TestPyPI./.github/workflows/publish-pypi.yml: publish to PyPI onv*tags (or manual dispatch).
How to Publish to PyPI
- Create package projects:
- Configure Trusted Publishing on each project:
- Owner/repo: your GitHub repo.
- Workflow file:
- TestPyPI:
.github/workflows/publish-testpypi.yml - PyPI:
.github/workflows/publish-pypi.yml
- TestPyPI:
- Environment name:
- TestPyPI:
testpypi - PyPI:
pypi
- TestPyPI:
- Test release on TestPyPI by running
Publish to TestPyPI(workflow dispatch). - Release to PyPI:
- Bump version in
pyproject.toml. - Commit and push.
- Tag and push
vX.Y.Z(must matchpyproject.tomlversion).
- Bump version in
- Verify install:
python -m pip install browseable==0.1.1
Optional Manual Publish (No GitHub Actions)
uv build
uvx twine check dist/*
uvx twine upload dist/*
For manual upload, create a PyPI API token and use TWINE_USERNAME=__token__ and TWINE_PASSWORD=<token> (or ~/.pypirc).
Metadata
Release files for browseable 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| browseable-0.1.0.tar.gz | 13.1 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| browseable-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 26.6 kB
Release files / browseable-0.1.0.tar.gz
| Download URL | browseable-0.1.0.tar.gz |
|---|---|
| Size | 13.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1e4e6398f22a885519c86e4a7d62abdbcce6bd2fc34f32884b0e56b199066e3e
|
|
BLAKE2b-256 checksum How to use checksums |
d85a6ee5a44edb67d5768a3284c2765e9ba95e8367b672fa5b5642a85b68ae52
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 21, 2026.
Transparency logRelease files / browseable-0.1.0-py3-none-any.whl
| Download URL | browseable-0.1.0-py3-none-any.whl |
|---|---|
| Size | 13.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fc8cc69f17ef02dd2037068de630f94543a27655ee9d4c927149bc43da561aac
|
|
BLAKE2b-256 checksum How to use checksums |
051f6b73527adabd5d0e687242790ab72894f7c2ba3f2dce9a213859434e1e52
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 21, 2026.
Transparency logSecurity for browseable 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for browseable-0.1.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Feb 21, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.