Skip to main content

TelePress

CI PyPI Python

中文文档

TelePress publishes Markdown, plain text, images, and ZIP galleries to Telegraph. It supports automatic pagination, external image hosts, image compression, concurrent uploads, and an optional REST API.

Requirements

  • Python 3.10 or newer
  • A Telegraph token, or permission to create one on first use
  • An image-host configuration only when publishing images or galleries

Installation

pip install telepress

# Optional REST API
pip install "telepress[api]"

# Optional S3-compatible hosts such as AWS S3 and Cloudflare R2
pip install "telepress[s3]"

# Optional YAML configuration files
pip install "telepress[yaml]"

Install from source for development:

git clone https://github.com/redtidev1918/telepress.git
cd telepress
python -m pip install --editable ".[dev]"

Quick start

Publish a document:

telepress article.md --title "My post"

# The explicit subcommand is equivalent
telepress publish article.md --title "My post"

Publish an image or ZIP gallery after configuring an image host:

telepress configure
telepress check
telepress photo.jpg --title "Photo"
telepress gallery.zip --title "Gallery"

Useful publishing options:

# Override the configured image limit in MiB
telepress gallery.zip --image-size-limit 10

# Keep original images instead of compressing oversized files
telepress gallery.zip --no-compress

# Use a Telegraph-compatible API endpoint
telepress article.md --api-url http://localhost:9009

Text-only publishing does not load or require an image-host configuration. The Telegraph access token is created automatically when needed and stored in ~/.telegraph_token unless one is supplied with --token.

REST API

Install the optional API dependencies first: pip install "telepress[api]".

telepress-server --host 127.0.0.1 --port 8000

Interactive OpenAPI documentation is available at http://127.0.0.1:8000/docs.

curl -X POST http://127.0.0.1:8000/publish/text \
  -H "Content-Type: application/json" \
  -d '{"content":"# Title\n\nBody","title":"Example"}'

curl -X POST http://127.0.0.1:8000/publish/file \
  -F "file=@article.md" \
  -F "title=Example"

curl -X POST http://127.0.0.1:8000/publish/gallery \
  -F "files=@p0.jpg" \
  -F "files=@p1.jpg" \
  -F "title=Gallery title" \
  -F "tags=pixiv, illustration" \
  -F "link=https://www.pixiv.net/artworks/123456" \
  -F "spoiler=true"

/publish/gallery accepts repeated files parts plus optional title, tags (comma-separated), link (source URL) and spoiler (truthy for R-18 content) form fields. Files are packed into a zip in upload order and published with automatic pagination and Prev/Next navigation; tags, link and the R-18 warning are rendered as a footer on the first page. It returns {"ok": true, "url": "...", "files": N} and is compatible with generic multipart delivery clients, e.g. PixivFlow httpMultipart targets pointing at http://<telepress-host>:8000/publish/gallery.

Blocking file, compression, and network work is dispatched away from the API event loop, so concurrent requests do not serialize on those operations.

Image hosts

Supported hosts:

  • ImgBB
  • Imgur
  • sm.ms
  • S3-compatible storage, including AWS S3, Cloudflare R2, OSS, and MinIO
  • Rclone remotes
  • Custom HTTP upload APIs

Run telepress configure for the interactive setup, or create ~/.telepress.json:

{
  "image_host": {
    "type": "rclone",
    "remote_path": "myremote:bucket/path",
    "public_url": "https://cdn.example.com/path",
    "rclone_flags": ["--transfers=32", "--checkers=32"],
    "max_size_mb": 20,
    "max_workers": 8
  }
}

S3-compatible configuration:

{
  "image_host": {
    "type": "s3",
    "access_key_id": "your-access-key",
    "secret_access_key": "your-secret-key",
    "bucket": "your-bucket",
    "public_url": "https://cdn.example.com",
    "endpoint_url": "https://s3.example.com",
    "region_name": "auto"
  }
}

Environment variables override file configuration:

export TELEPRESS_IMAGE_HOST_TYPE=imgbb
export TELEPRESS_IMAGE_HOST_API_KEY=your-key

Configuration is searched in the following locations:

  1. The path passed to load_config()
  2. TELEPRESS_CONFIG
  3. ~/.telepress.json, ~/.telepress.yaml, ~/.telepress.yml
  4. ~/.config/telepress.json

Python API

from telepress import TelegraphPublisher, publish, publish_text

url = publish("article.md", title="My article")
text_url = publish_text("# Hello\n\nWorld", title="Hello")

publisher = TelegraphPublisher(image_size_limit=10)
gallery_url = publisher.publish("gallery.zip", title="Gallery")

Upload images directly:

from telepress import ImageUploader

uploader = ImageUploader("imgbb", api_key="your-key")
url = uploader.upload("photo.jpg")

batch = uploader.upload_batch(["1.jpg", "2.jpg"])
print(batch.success_rate, batch.get_url_map())

Behavior and limits

  • Markdown and plain text are converted to Telegraph DOM nodes.
  • Plain text chapter headings such as Chapter 1 and 第一章 are detected.
  • Large text is split near 10,000-character boundaries and linked with previous/next navigation.
  • Galleries are split at 100 images per page.
  • Images larger than 5 MiB are compressed by default; GIF compression is intentionally skipped.
  • A 2 GiB input safety limit is applied before processing.
  • Duplicate text publications are cached in ~/.telepress_cache.json by default.

Supported input extensions include .txt, .md, .markdown, .rst, .text, .jpg, .jpeg, .png, .gif, .webp, .bmp, and .zip.

Error handling

from telepress import TelePressError, ValidationError, publish

try:
    url = publish("article.md")
except ValidationError as exc:
    print(f"Invalid input: {exc}")
except TelePressError as exc:
    print(f"Publishing failed: {exc}")

Development and releases

python -m pip install --editable ".[dev]"
python -m pytest --cov
python -m build
python -m twine check dist/*

See CONTRIBUTING.md for contribution conventions and docs/RELEASING.md for the automated release workflow. Notable changes are recorded in CHANGELOG.md.

License

MIT

Release files for telepress 0.6.1

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

Source distribution (sdist)

Source distribution for telepress 0.6.1
File Size Uploaded
telepress-0.6.1.tar.gz 70.9 kB Details

Built distribution (wheel)

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

Total release size: 109.4 kB

Release files / telepress-0.6.1.tar.gz

Download URL telepress-0.6.1.tar.gz
Size 70.9 kB
Tags Source
SHA-256 checksum
How to use checksums
e7f8a60c69cee75ccfd8dcbb6df81023cd9b10a5e46efb1099122cae35d5a314
BLAKE2b-256 checksum
How to use checksums
4bd8ea65336f5ba6309443cb525d77c028f97379d65e8b88e7d33e6a69f8eac0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.

Transparency log

Release files / telepress-0.6.1-py3-none-any.whl

Download URL telepress-0.6.1-py3-none-any.whl
Size 38.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
28e62da71ebb358459599b55ef830f67b764c320d49e48e281a9ee82fbc02b4a
BLAKE2b-256 checksum
How to use checksums
94016ca6345c300da8376268fb191717eb97baf0182283efee9aea1e2a1b4f37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 8, 2026.

Transparency log

Release history Release notifications | RSS feed

0.14.1

2 release files

0.14.0

2 release files

0.13.1

2 release files

0.13.0

2 release files

0.12.1

2 release files

0.12.0

2 release files

0.11.0

2 release files

0.10.0

2 release files

0.9.0

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

This release

0.6.1 This release

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.5

2 release files

0.3.4

2 release files

0.3.3

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

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