Text watermark/stamp tool (CLI-first, GUI-ready).
Project description
Markforge
Markforge is a small, sharp tool for stamping images with text watermarks. It is CLI-first and ships with a local GUI for batch workflows.
Features
- Tiled or centered marks
- Opacity, angle, padding, offset, and blend modes
- Auto-scale text to the image or set a fixed font size
- Local GUI with live preview, system fonts, and batch export
- Output format inferred from extension (PNG/JPEG/WEBP/TIFF/BMP)
Requirements
- Python 3.10+ (tested on 3.10-3.13)
Install
pip install markforge
For development:
pip install -e ".[dev]"
Quickstart (CLI)
Stamp a tiled watermark:
markforge watermark input.jpg output.jpg --text "DRAFT" --opacity 0.15 --angle -30 --tile
Or a single centered mark:
markforge watermark input.jpg output.jpg --text "DRAFT" --center --no-tile --scale 0.35
Show full help:
markforge --help
markforge watermark --help
Common options:
--text/-twatermark text (required for useful output)--opacityin the 0..1 range--anglerotation in degrees--fillcolor (hex or named, via Pillow ImageColor)--fontpath to a .ttf/.otf font--font-sizefixed point size--scaleauto size as a fraction of the smaller image dimension (overrides--font-size)--tile/--no-tileand--paddingspacing between tiles--centercenter a single watermark (use with--no-tile)--offsetpixel offset asx,y--blendone ofnormal,multiply,overlay,soft_light--antialias/--no-antialiasfor rotated text smoothing
Notes:
- Output format is inferred from the output extension. Unknown extensions default to PNG.
- JPEG output is flattened to white because JPEG does not support alpha.
- If no font is provided, Markforge tries
DejaVuSans.ttfand falls back to Pillow's default.
GUI
Launch the local GUI (opens a browser tab by default):
markforge gui
Details:
- Binds to
127.0.0.1by default and chooses a free port. - Exports default to
./exportsunless you pick a folder or type a path. - You can serve a custom UI with
--html path/to/index.html. - The "Pick" buttons use Tkinter; on minimal Linux installs you may need to add it, or use the built-in file picker and manual paths instead.
Development
pytest
ruff check .
License
Markforge is free to use and redistribute in unmodified form only. Modification, forking,
and derivative works are not permitted. This is a source-available license. See LICENSE
for full terms.
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 markforge-0.1.1.tar.gz.
File metadata
- Download URL: markforge-0.1.1.tar.gz
- Upload date:
- Size: 6.7 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4a86f72d1bb0a6117820fb9ab4da214923f6c673d9a15dab55764fcbaf74fc5
|
|
| MD5 |
5cee006da32a88ac7098331c134c765e
|
|
| BLAKE2b-256 |
cdfb74f6aef3db661908c19444d4a90b081a9ef39fec7720870bcaacc718a494
|
Provenance
The following attestation bundles were made for markforge-0.1.1.tar.gz:
Publisher:
publish.yml on Remgrandt/markforge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
markforge-0.1.1.tar.gz -
Subject digest:
c4a86f72d1bb0a6117820fb9ab4da214923f6c673d9a15dab55764fcbaf74fc5 - Sigstore transparency entry: 876388564
- Sigstore integration time:
-
Permalink:
Remgrandt/markforge@f876b35ea32b05391459c9520e9ddcd01faa575b -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Remgrandt
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f876b35ea32b05391459c9520e9ddcd01faa575b -
Trigger Event:
push
-
Statement type:
File details
Details for the file markforge-0.1.1-py3-none-any.whl.
File metadata
- Download URL: markforge-0.1.1-py3-none-any.whl
- Upload date:
- Size: 26.4 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 |
9274ce1d9851cf3cb11d5b43cf8034470f0277ee97efd89d3c2938f2f92ebf38
|
|
| MD5 |
ce18f1e48089e2afa552425c70c2014c
|
|
| BLAKE2b-256 |
8d0908cdf596c655d7928f8f98f665e6ce8304e4361755ea9bd5ba99cf45d213
|
Provenance
The following attestation bundles were made for markforge-0.1.1-py3-none-any.whl:
Publisher:
publish.yml on Remgrandt/markforge
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
markforge-0.1.1-py3-none-any.whl -
Subject digest:
9274ce1d9851cf3cb11d5b43cf8034470f0277ee97efd89d3c2938f2f92ebf38 - Sigstore transparency entry: 876388632
- Sigstore integration time:
-
Permalink:
Remgrandt/markforge@f876b35ea32b05391459c9520e9ddcd01faa575b -
Branch / Tag:
refs/tags/v0.1.1 - Owner: https://github.com/Remgrandt
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f876b35ea32b05391459c9520e9ddcd01faa575b -
Trigger Event:
push
-
Statement type: