Skip to main content

FrameCredit

Burn your X handle into every frame of your video before you publish, so reposted copies still credit you.

ci License: AGPL-3.0 Python 3.11+

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.

FrameCredit local app with a Source Video loaded and the Creator Marker preview visible

Website · FAQ · Changelog · 简体中文

Install

FrameCredit needs ffmpeg/ffprobe on PATH. The uv route below also manages Python for you; if you already have Python 3.11+, plain pip works too.

macOS

brew install uv ffmpeg
uv tool install framecredit

Windows (PowerShell)

winget install astral-sh.uv
winget install --id Gyan.FFmpeg.Essentials -e --source winget
uv tool install framecredit

Debian/Ubuntu

sudo apt update && sudo apt install ffmpeg
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install framecredit

With an existing Python 3.11+

python3 -m pip install framecredit

Open a new terminal, then confirm everything is ready:

framecredit --version && ffmpeg -version && ffprobe -version

Upgrade later with uv tool upgrade framecredit or python3 -m pip install -U framecredit.

Quick start

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 · @handle marker 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.

Metadata

Release files for framecredit 0.1.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for framecredit 0.1.3
File Size Uploaded
framecredit-0.1.3.tar.gz 37.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for framecredit 0.1.3
File Interpreter ABI Platform
framecredit-0.1.3-py3-none-any.whl Python 3 none any Details

Total release size: 67.8 kB

Release files / framecredit-0.1.3.tar.gz

Download URL framecredit-0.1.3.tar.gz
Size 37.8 kB
Tags Source
SHA-256 checksum
How to use checksums
898f998703b9e5758e74c58061a5060fff1e5048fef37558ab65a0192c7d06c5
BLAKE2b-256 checksum
How to use checksums
07dfff328bfed0bcf171a3f6dbeb584350c918cdaad11c46870a30e15b31206e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.6

Release files / framecredit-0.1.3-py3-none-any.whl

Download URL framecredit-0.1.3-py3-none-any.whl
Size 30.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3828236e8acd021b82abc8f96886f41cc9af9ca69dbcab29328d353cd6279d1f
BLAKE2b-256 checksum
How to use checksums
fb58368ba65560d78e1318ed69569f66a2efee4de4abc095d146939faabb7704
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.6

Release history Release notifications | RSS feed

This release

0.1.3 This release

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page