LLM-assisted high-res marketing screenshots for SaaS apps (generic login via Playwright storage_state).
Project description
shots
Generic, open-source friendly tooling to capture high-res marketing screenshots of a SaaS app.
Key idea: you log in once manually; shots saves a Playwright storage_state.json. After that, it can run repeatedly headless, optionally guided by an LLM (vision) to navigate and/or crop.
Install
python -m venv .venv
source .venv/bin/activate
pip install -e ".[llm,yaml]"
playwright install chromium
Setup
cp shots.yaml.example shots.yaml # edit with your app's URL and shots
cp .env.example .env # add your OPENAI_API_KEY
Both shots.yaml and .env are gitignored.
1) One-time manual login
shots login --base-url https://your-app.example.com --out-dir shots_out
This writes shots_out/storage_state.json.
2) Run required screenshots from a config
export OPENAI_API_KEY=...
shots run-config --config shots.yaml --out-dir shots_out --use-llm --use-llm-crop --save-source
Config format (YAML)
base_url: https://your-app.example.com
start: /app
defaults:
viewport_preset: desktop
full_page: true
max_nav_steps: 12
shots:
- id: dashboard-hero
description: >
Capture the main dashboard with KPI cards and a chart visible.
Navigate via the left nav if needed. Close any modal/tour/cookie overlay.
url: /app/dashboard
- id: integrations
description: >
Show Settings -> Integrations page listing available integrations.
viewport_preset: laptop
Notes
--use-llmenables multi-step "acquire the shot" behavior: the model returns one action at a time until it saysdone.--use-llm-cropasks the model to choose a crop rectangle for a marketing-friendly framing.- All navigation is kept same-origin as
base_url.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file shots-0.2.0.tar.gz.
File metadata
- Download URL: shots-0.2.0.tar.gz
- Upload date:
- Size: 122.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4ce1439fe44cff02d874bcba0e09320c1224498e03d1308ee0d73f52c7a60c05
|
|
| MD5 |
dc169a3faa3933f5a1facfc940e184f9
|
|
| BLAKE2b-256 |
9a6d0ba7db462ad132413dc03cd7847a0066c1265a1a19ccddcae0f00f6c25d5
|
Provenance
The following attestation bundles were made for shots-0.2.0.tar.gz:
Publisher:
build.yml on gaussian/shots
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
shots-0.2.0.tar.gz -
Subject digest:
4ce1439fe44cff02d874bcba0e09320c1224498e03d1308ee0d73f52c7a60c05 - Sigstore transparency entry: 983376953
- Sigstore integration time:
-
Permalink:
gaussian/shots@8f2e4e155701bcc280f1699bff4977d736f5093f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/gaussian
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build.yml@8f2e4e155701bcc280f1699bff4977d736f5093f -
Trigger Event:
pull_request_target
-
Statement type:
File details
Details for the file shots-0.2.0-py3-none-any.whl.
File metadata
- Download URL: shots-0.2.0-py3-none-any.whl
- Upload date:
- Size: 33.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2a86e983bf15c65e2ae3be0b95d441b7c75695024369d6e2b6777ad172bce8e7
|
|
| MD5 |
7a93076cef37f1eda8ad0522239710ec
|
|
| BLAKE2b-256 |
83f8d6e7a571a9ad7dcab6fcca17708c9c096935fa37fbd3f6e329722a351d3e
|
Provenance
The following attestation bundles were made for shots-0.2.0-py3-none-any.whl:
Publisher:
build.yml on gaussian/shots
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
shots-0.2.0-py3-none-any.whl -
Subject digest:
2a86e983bf15c65e2ae3be0b95d441b7c75695024369d6e2b6777ad172bce8e7 - Sigstore transparency entry: 983376954
- Sigstore integration time:
-
Permalink:
gaussian/shots@8f2e4e155701bcc280f1699bff4977d736f5093f -
Branch / Tag:
refs/heads/main - Owner: https://github.com/gaussian
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
build.yml@8f2e4e155701bcc280f1699bff4977d736f5093f -
Trigger Event:
pull_request_target
-
Statement type: