Metadata-Version: 2.5
Name: graftpunk-lite
Version: 1.20.1
Summary: Authenticated browser sessions, captured once and replayed over plain HTTP: stealth login, encrypted at rest, pluggable storage. Lite install: no browser stack, so it resolves under Pyodide and Cloudflare Workers; graftpunk-lite[browser] equals graftpunk.
Project-URL: Homepage, https://github.com/stavxyz/graftpunk
Project-URL: Repository, https://github.com/stavxyz/graftpunk
Project-URL: Documentation, https://github.com/stavxyz/graftpunk#readme
Project-URL: Changelog, https://github.com/stavxyz/graftpunk/blob/main/CHANGELOG.md
Project-URL: Issues, https://github.com/stavxyz/graftpunk/issues
Author-email: stavxyz <stavxyz@users.noreply.github.com>
License-Expression: MIT
License-File: LICENSE
Keywords: api,automation,browser,cdp,csrf,har,nodriver,requests,scraping,selenium,session
Classifier: Development Status :: 5 - Production/Stable
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Topic :: Internet :: WWW/HTTP :: Browsers
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.11
Requires-Dist: brotli>=1.1.0
Requires-Dist: cryptography>=42.0.0
Requires-Dist: dill>=0.3.0
Requires-Dist: fpdf2>=2.8.0
Requires-Dist: idna>=3.0
Requires-Dist: packaging>=23.0
Requires-Dist: pydantic-settings>=2.0.0
Requires-Dist: pyotp>=2.9.0
Requires-Dist: python-slugify>=8.0.0
Requires-Dist: pyyaml>=6.0
Requires-Dist: requests>=2.28.0
Requires-Dist: rich>=13.0.0
Requires-Dist: structlog>=23.0.0
Requires-Dist: typer>=0.21
Requires-Dist: xlsxwriter>=3.0.0
Provides-Extra: all
Requires-Dist: boto3>=1.34.0; extra == 'all'
Requires-Dist: cssselect>=1.2.0; extra == 'all'
Requires-Dist: httpie>=3.0.0; extra == 'all'
Requires-Dist: jmespath>=1.0.0; extra == 'all'
Requires-Dist: lxml>=5.0.0; extra == 'all'
Requires-Dist: mypy>=1.10.0; extra == 'all'
Requires-Dist: nodriver>=0.48; (python_version < '3.14') and extra == 'all'
Requires-Dist: nodriver>=0.50.6; (python_version >= '3.14') and extra == 'all'
Requires-Dist: openpyxl>=3.1.0; extra == 'all'
Requires-Dist: pytest-cov>=4.0.0; extra == 'all'
Requires-Dist: pytest-mock>=3.0.0; extra == 'all'
Requires-Dist: pytest-xdist>=3.0.0; extra == 'all'
Requires-Dist: pytest>=8.0.0; extra == 'all'
Requires-Dist: requestium>=0.2.5; extra == 'all'
Requires-Dist: ruff>=0.5.0; extra == 'all'
Requires-Dist: selenium-stealth>=1.0.6; extra == 'all'
Requires-Dist: selenium>=4.0.0; extra == 'all'
Requires-Dist: supabase>=2.10.0; extra == 'all'
Requires-Dist: undetected-chromedriver>=3.5.0; extra == 'all'
Requires-Dist: webdriver-manager>=4.0.0; extra == 'all'
Provides-Extra: browser
Requires-Dist: httpie>=3.0.0; extra == 'browser'
Requires-Dist: nodriver>=0.48; (python_version < '3.14') and extra == 'browser'
Requires-Dist: nodriver>=0.50.6; (python_version >= '3.14') and extra == 'browser'
Requires-Dist: requestium>=0.2.5; extra == 'browser'
Requires-Dist: selenium-stealth>=1.0.6; extra == 'browser'
Requires-Dist: selenium>=4.0.0; extra == 'browser'
Requires-Dist: undetected-chromedriver>=3.5.0; extra == 'browser'
Requires-Dist: webdriver-manager>=4.0.0; extra == 'browser'
Provides-Extra: dev
Requires-Dist: cssselect>=1.2.0; extra == 'dev'
Requires-Dist: httpie>=3.0.0; extra == 'dev'
Requires-Dist: lxml>=5.0.0; extra == 'dev'
Requires-Dist: mypy>=1.10.0; extra == 'dev'
Requires-Dist: nodriver>=0.48; (python_version < '3.14') and extra == 'dev'
Requires-Dist: nodriver>=0.50.6; (python_version >= '3.14') and extra == 'dev'
Requires-Dist: openpyxl>=3.1.0; extra == 'dev'
Requires-Dist: pytest-cov>=4.0.0; extra == 'dev'
Requires-Dist: pytest-mock>=3.0.0; extra == 'dev'
Requires-Dist: pytest-xdist>=3.0.0; extra == 'dev'
Requires-Dist: pytest>=8.0.0; extra == 'dev'
Requires-Dist: requestium>=0.2.5; extra == 'dev'
Requires-Dist: ruff>=0.5.0; extra == 'dev'
Requires-Dist: selenium-stealth>=1.0.6; extra == 'dev'
Requires-Dist: selenium>=4.0.0; extra == 'dev'
Requires-Dist: undetected-chromedriver>=3.5.0; extra == 'dev'
Requires-Dist: webdriver-manager>=4.0.0; extra == 'dev'
Provides-Extra: jmespath
Requires-Dist: jmespath>=1.0.0; extra == 'jmespath'
Provides-Extra: nodriver
Requires-Dist: httpie>=3.0.0; extra == 'nodriver'
Requires-Dist: nodriver>=0.48; (python_version < '3.14') and extra == 'nodriver'
Requires-Dist: nodriver>=0.50.6; (python_version >= '3.14') and extra == 'nodriver'
Requires-Dist: requestium>=0.2.5; extra == 'nodriver'
Requires-Dist: selenium-stealth>=1.0.6; extra == 'nodriver'
Requires-Dist: selenium>=4.0.0; extra == 'nodriver'
Requires-Dist: undetected-chromedriver>=3.5.0; extra == 'nodriver'
Requires-Dist: webdriver-manager>=4.0.0; extra == 'nodriver'
Provides-Extra: s3
Requires-Dist: boto3>=1.34.0; extra == 's3'
Provides-Extra: supabase
Requires-Dist: supabase>=2.10.0; extra == 'supabase'
Description-Content-Type: text/markdown

# graftpunk-lite

graftpunk-lite is graftpunk without the browser stack: the same `graftpunk`
package and version, with only browser-free dependencies, so it installs under
Pyodide and Cloudflare Python Workers. It replays a cached session through
`load_session_for_api_from_bytes`, given the session's encrypted bytes and its
key. It cannot log in. The `gp` command is installed. On graftpunk-lite,
`gp version`, `gp session list`, `gp session show`, `gp config`, `gp plugins`,
`gp http` with `--no-session`, a plugin command that needs no session, and
`load_session_for_api_from_bytes` work. Everything that loads a cached session
from the session store (`load_session_for_api`, `gp http` with a session from
`--session`, `gp session use` or `GRAFTPUNK_SESSION`, a plugin command that uses
its session, and `gp session export`) and every command that drives a browser
(recording with `gp observe`, and a plugin's `login` command) need
`graftpunk-lite[browser]` or `graftpunk`; without it, those commands print the
install command and exit 1.

```bash
pip install graftpunk-lite
pip install 'graftpunk-lite[browser]'   # adds the browser stack; equals graftpunk
```

Install graftpunk-lite or graftpunk, never both: they own the same files, so
uninstalling either one deletes files the other needs. Plugins declare
`graftpunk[browser]`, so install them where graftpunk is installed. Installing
one where graftpunk-lite is installed, with or without `[browser]`, pulls
graftpunk in beside it, the both-installed state to avoid.

Full documentation: [https://github.com/stavxyz/graftpunk/blob/v1.20.1/README.md](https://github.com/stavxyz/graftpunk/blob/v1.20.1/README.md)
