Burn your X handle into your videos before you publish, so reposted copies still credit you. Local-only video attribution.
Project description
FrameCredit
Burn your X handle into every frame of your video before you publish, so reposted copies still credit you.
When your video gets downloaded and re-uploaded on X (Twitter), the repost
usually keeps everything except one thing: you. FrameCredit renders a compact,
outlined X · @yourhandle Creator Marker into the video pixels themselves.
Unlike metadata or a static logo in one corner, the marker survives
re-encoding and travels with every copy, and it alternates between the two top
corners every 30 seconds so no part of your content is permanently covered.
Everything runs on your own machine. No accounts, no uploads, no cloud.
Website · FAQ · Changelog · 简体中文
Quick start
Requires Python 3.11+ and ffmpeg/ffprobe on PATH
(brew install ffmpeg / apt install ffmpeg).
python3 -m pip install framecredit # upgrade later with: pip install -U framecredit
Command line - one video in, one Attributed Export out:
framecredit process input.mp4 --x-handle "@yourhandle" --output attributed.mp4
Local app - save your handle once, then drag and drop:
framecredit app
The app opens in your browser, previews the real marker on the first frame of
your video, and writes Attributed Exports to ~/Movies/FrameCredit. It
listens only on 127.0.0.1; your footage never leaves the machine. Keep the
terminal running while you use it; Ctrl+C stops it.
What you get
- A compact one-line
X · @handlemarker in transparent outlined text, readable on both light and dark footage, with no opaque panel behind it. - Deterministic placement: top-left for 0-30 seconds, top-right for 30-60, repeating. Nothing to configure per video.
- Standard output: H.264 video + AAC audio MP4 that keeps the source dimensions, audio track, and duration (within 150 milliseconds), ready to upload anywhere.
- Guardrails: still images and unreadable files fail with clear messages, existing outputs are never silently overwritten, and failed encodes never leave partial files behind.
What FrameCredit does not promise
FrameCredit is honest about its scope: the goal is Attribution Survival, not theft prevention.
- Burned-in pixels cannot be a clickable link or a QR code.
- A determined editor can crop, cover, or paint over any visible marker.
- What it does do: after an ordinary repost (re-encode, light crop, added captions), viewers can still read your handle and search for you.
Contributing
Issues and pull requests welcome - see CONTRIBUTING.md. The project vocabulary lives in CONTEXT.md; architectural decisions in docs/adr/.
License
AGPL-3.0-or-later. You can use, modify, and redistribute FrameCredit freely; if you run a modified version as a network service, you must offer its source to your users under the same license.
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 framecredit-0.1.2.tar.gz.
File metadata
- Download URL: framecredit-0.1.2.tar.gz
- Upload date:
- Size: 36.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c31d7a714aa2e2cc10fce6b426ca059b0efe327b4e341983fc35b2b220893bc7
|
|
| MD5 |
ac2c995b77953da42fdbe02b3c89ad04
|
|
| BLAKE2b-256 |
5a0c7aa705ced61fc19377f33a2285ab33869680984479569506e61173483e1e
|
File details
Details for the file framecredit-0.1.2-py3-none-any.whl.
File metadata
- Download URL: framecredit-0.1.2-py3-none-any.whl
- Upload date:
- Size: 29.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
201e132a4b17ea9a0de3d0a9b9dd5024deb7644722feadb96f9ebc00d9be469e
|
|
| MD5 |
d389f1208fd2f41fae727578eeb1192d
|
|
| BLAKE2b-256 |
879517de5fe38f2bb6eee11dda45f2d084d5dd2a31c96c41461bad1b1b09335f
|