A robust, Pillow-based alternative to fastlane frameit for composing premium mobile marketing screenshots.
Project description
screenshot-framer
A robust, Python-based CLI tool to composite premium marketing screenshots for iOS and Android applications.
screenshot-framer was built as a lightweight, flexible alternative to fastlane frameit. It bypasses the common system-level ImageMagick/FreeType font rendering failures by relying entirely on Python's self-contained Pillow library for image composition, device rounding, drop shadows, and responsive text overlay.
Features
- No ImageMagick Required: Pure Python image manipulation using
Pillow. - Cross-Platform Auto-Detection: Dynamically detects iOS (flat directories) and Android (nested
phoneScreenshots,sevenInchScreenshots,tenInchScreenshots) architectures and automatically applies the correct scaling and border radii. - Dynamic Text Scaling: Automatically scales down long titles so they never clip off the edge of your marketing canvas.
- Modern Device Styling: Instead of forcing clunky hardware bezels onto your UI, it elegantly rounds the corners of your raw screenshots and applies a premium Gaussian drop-shadow, floating it over your chosen background.
- Fastlane Compatible: Can parse your existing
title.stringsandkeyword.stringsfiles directly.
Installation
pip install screenshot-framer
Usage
Create a configuration JSON file (e.g. framer_config.json) in your project:
{
"base_dir": "./fastlane/metadata/android/en-US",
"background": "./fastlane/metadata/android/en-US/background.png",
"title_font": "/System/Library/Fonts/SFCompact.ttf",
"keyword_font": "/System/Library/Fonts/SFCompact.ttf",
"title_color": "#ffffff",
"keyword_color": "#c8c8c8",
"device_radius_phone": 80,
"device_radius_seven_inch": 70,
"device_radius_tablet": 60,
"shadow_radius": 50,
"shadow_opacity": 150,
"screenshot_scale": 0.70,
"exclude_files": ["01_dashboard.png", "raw_marketing.png"],
"fallback_title": "Upnext",
"default_disclaimer": "TV SHOW METADATA PROVIDED BY TVMAZE.COM"
}
Configuration Options
screenshot_scale: Defines how large the device will appear relative to the background canvas height (e.g.,0.70means 70% of the canvas height).exclude_files: An array of substrings. Any raw screenshot containing these strings in its filename will be skipped.device_radius_*: Defines the corner roundness depending on whether the detected screenshot belongs to a phone, 7-inch tablet, or 10-inch tablet.
Then run the tool from your terminal:
screenshot-framer --config framer_config.json
How It Works
- Discovery: The script intelligently scans the
base_dirand common fastlane subdirectories (phoneScreenshots,sevenInchScreenshots,tenInchScreenshots). - Device Detection: It determines the device type (Phone, 7-inch Tablet, 10-inch Tablet) based on the containing folder or the filename (perfect for iOS devices like
iPad Pro). - Matching: It maps your raw screenshots to the translated strings in
title.strings. - Compositing: It scales your background, frames your screenshot with rounded corners, adds a premium drop shadow, and responsively fits your Title and Keyword text.
- Export: It outputs
_framed.pngfiles ready for the App Store and Google Play.
Project details
Release history Release notifications | RSS feed
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 screenshot_framer-0.4.0.tar.gz.
File metadata
- Download URL: screenshot_framer-0.4.0.tar.gz
- Upload date:
- Size: 6.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f1041bd7faa793c2e974b0e0109aa3711f8a277437bae8335ffe7f06abc2b26f
|
|
| MD5 |
e2af0a37afa915fc8d50ba266efba8e7
|
|
| BLAKE2b-256 |
fba400ce5f4c29a27c3b4bd332f529d2714f031abb8fc2dfb8c5f55fe72d4690
|
Provenance
The following attestation bundles were made for screenshot_framer-0.4.0.tar.gz:
Publisher:
publish.yml on akitikkx/screenshot-framer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
screenshot_framer-0.4.0.tar.gz -
Subject digest:
f1041bd7faa793c2e974b0e0109aa3711f8a277437bae8335ffe7f06abc2b26f - Sigstore transparency entry: 1365137256
- Sigstore integration time:
-
Permalink:
akitikkx/screenshot-framer@a17c3365bb3651bb1052938fe11ae5e8ac038a14 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/akitikkx
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a17c3365bb3651bb1052938fe11ae5e8ac038a14 -
Trigger Event:
release
-
Statement type:
File details
Details for the file screenshot_framer-0.4.0-py3-none-any.whl.
File metadata
- Download URL: screenshot_framer-0.4.0-py3-none-any.whl
- Upload date:
- Size: 8.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
459fcba7660100deae81d79a4b7a972f261f0369640bfb997558e7330d29a0fc
|
|
| MD5 |
fb7329aca464ed7eff4ba13764b475b7
|
|
| BLAKE2b-256 |
20d92db51c5669f3f6387f442822fdd27d33468318118397654a42d67503cfa5
|
Provenance
The following attestation bundles were made for screenshot_framer-0.4.0-py3-none-any.whl:
Publisher:
publish.yml on akitikkx/screenshot-framer
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
screenshot_framer-0.4.0-py3-none-any.whl -
Subject digest:
459fcba7660100deae81d79a4b7a972f261f0369640bfb997558e7330d29a0fc - Sigstore transparency entry: 1365137273
- Sigstore integration time:
-
Permalink:
akitikkx/screenshot-framer@a17c3365bb3651bb1052938fe11ae5e8ac038a14 -
Branch / Tag:
refs/tags/v0.4.0 - Owner: https://github.com/akitikkx
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@a17c3365bb3651bb1052938fe11ae5e8ac038a14 -
Trigger Event:
release
-
Statement type: