Skip to main content

Bot to boost/reblog posts with specified tags

Project description

Zhongli

Automatically boost/reblog Fediverse posts. Formerly Fedibooster.

Repo CI Downloads AGPL

Overview

Zhongli consumes pre-filtered posts from FenLiu's queue and automatically reblogs them to your Fediverse account. FenLiu handles the heavy lifting (filtering, spam detection, curation); Zhongli handles the reblogging and duplicate prevention.

FenLiu configuration is required. There is no legacy mode.

Status

Phase Status Notes
1: Infrastructure ✅ Complete FenLiu client, models, tests
2: FenLiu-Only Mode ✅ Complete ReblogService, queue polling, attachments
3: Validation Optimization ✅ Complete MinimalValidator, pre-filtered posts
4: Documentation ✅ Complete FenLiu-only, updated config
5: UX Polish ⏳ Optional Metrics, dry-run, progress indicators

Install

pip install zhongli

Or from source:

git clone https://codeberg.org/marvinsmastodontools/zhongli.git
cd zhongli
uv sync
uv run zhongli

Configuration

Zhongli requires FenLiu and a Fediverse account:

[fediverse]
domain_name = "mastodon.social"
api_token = "your-token"

[fenliu]
base_url = "https://fenliu.example.com"
api_key = "your-api-key"

# Optional
run_continuously = false
delay_between_posts = 300
reblog_sensitive = false
max_reblog = 5

Configuration explained:

  • [fediverse] - Your Mastodon/Pixelfed/Misskey account
  • [fenliu] - Connection to FenLiu queue service
  • run_continuously - Keep polling or exit after max_reblog posts
  • delay_between_posts - Seconds between reblogs (0 for no delay)
  • reblog_sensitive - Whether to boost sensitive/NSFW posts
  • max_reblog - Stop after boosting N posts (0 for unlimited)

Usage

zhongli config.toml                 # Run with config file
zhongli config.toml --max-posts 10  # Override max posts
zhongli --help                      # Show all options

How It Works

  1. Poll FenLiu Queue - Get next curated post
  2. Validate - Quick checks (has content, not a reply, respects sensitive setting)
  3. Find on Fediverse - Search for post by URL
  4. Check for Duplicates - Compare attachments (URL, hash, perceptual)
  5. Reblog - Boost to your account with circuit breaker protection
  6. Report Feedback - ACK (success), NACK (transient error), ERROR (permanent)
  7. Repeat - Until configured limit or continuous mode ends

Features

  • FenLiu Integration - Consume pre-curated, pre-filtered posts
  • Duplicate Prevention - Three-layer attachment detection (URL, SHA-256, dHash)
  • Reliable Reblogging - Circuit breaker pattern, retry logic, error classification
  • Smart Feedback - ACK/NACK/ERROR reporting to FenLiu
  • Production Ready - 80+ tests, full type checking, comprehensive error handling

Development

uv sync              # Install deps
prek run --all-files # Pre-commit checks
pytest               # Run tests (80+ tests)
nox                  # Full CI simulation

Recent Work

  • ✅ Phase 3: Validation optimized for FenLiu pre-filtered posts
  • ✅ Phase 2: Full FenLiu-only mode operational
  • ✅ Phase 1: FenLiu infrastructure complete with 80+ tests
  • ✅ Attachment deduplication system (URL, content hash, perceptual hash)
  • ✅ Circuit breaker pattern integrated
  • ✅ Complete feedback mechanism (ACK/NACK/ERROR)

Next Steps

Phase 5 - UX polish and observability (metrics, dry-run mode, progress indicators)

License

GNU AGPL v3.0

Support

  • Buy me coffee
  • Monero: 88xtj3hqQEpXrb5KLCigRF1azxDh8r9XvYZPuXwaGaX5fWtgub1gQsn8sZCmEGhReZMww6RRaq5HZ48HjrNqmeccUHcwABg

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

zhongli-2026.4.3.tar.gz (20.3 kB view details)

Uploaded Source

Built Distribution

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

zhongli-2026.4.3-py3-none-any.whl (24.4 kB view details)

Uploaded Python 3

File details

Details for the file zhongli-2026.4.3.tar.gz.

File metadata

  • Download URL: zhongli-2026.4.3.tar.gz
  • Upload date:
  • Size: 20.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for zhongli-2026.4.3.tar.gz
Algorithm Hash digest
SHA256 c410c1b59eafb57cfab7799efc563ee9cc9c3e32fbbe71f4c7234c8b3d46fb4a
MD5 c2a019de07163bbcb40091f46bae4e98
BLAKE2b-256 0f051b01ca313ea0db3eace94ad0f19c5c3c5adafe31ce353ca50e2ba1dd2e26

See more details on using hashes here.

File details

Details for the file zhongli-2026.4.3-py3-none-any.whl.

File metadata

  • Download URL: zhongli-2026.4.3-py3-none-any.whl
  • Upload date:
  • Size: 24.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Debian GNU/Linux","version":"13","id":"trixie","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for zhongli-2026.4.3-py3-none-any.whl
Algorithm Hash digest
SHA256 62c0e8e5f331a5b09c8d31101741f86b2553a2938e2cd34d2180939d3b311089
MD5 ccb50b53daf20f477f685cd2b9be0efc
BLAKE2b-256 bb5d7555c7ad8dc0c8bd246a976a97e343643c5bb1cbf964c9f673e059fb3de8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page