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"

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

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

telepress-0.4.0.tar.gz (65.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

telepress-0.4.0-py3-none-any.whl (35.8 kB view details)

Uploaded Python 3

File details

Details for the file telepress-0.4.0.tar.gz.

File metadata

  • Download URL: telepress-0.4.0.tar.gz
  • Upload date:
  • Size: 65.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for telepress-0.4.0.tar.gz
Algorithm Hash digest
SHA256 831f722d8dcd8a57d13ba0e8f7fc4776d204fda71b70f3e81d2706ff459b4723
MD5 1a244dc509800b63ea011ad32249f5a0
BLAKE2b-256 a28a6e8094efc4e80d296e843c100ed8d4b545e1df877acfc0f327474377b7a5

See more details on using hashes here.

Provenance

The following attestation bundles were made for telepress-0.4.0.tar.gz:

Publisher: release.yml on redtidev1918/telepress

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file telepress-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: telepress-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 35.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for telepress-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 86c382c64ca661e5daf1adabb9f6a5242da42b6ced4cf78d9746d13b2bb09644
MD5 e7e8dc690868523b28d779e7fffecde0
BLAKE2b-256 28067a3d59e84476f11fd2e79e5c445ebb5479cf226c9c44cf4a4abbe1fbae9d

See more details on using hashes here.

Provenance

The following attestation bundles were made for telepress-0.4.0-py3-none-any.whl:

Publisher: release.yml on redtidev1918/telepress

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.5.0

2 files

This release

0.4.0 This release

2 files

0.3.5

2 files

0.3.4

2 files

0.3.3

2 files

0.3.2

2 files

0.3.1

2 files

0.3.0

2 files

0.2.4

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.1

2 files

0.1.0

2 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