Bot to boost/reblog posts with specified tags
Project description
Zhongli
Automatically boost/reblog Fediverse posts. Formerly Fedibooster.
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 servicerun_continuously- Keep polling or exit aftermax_reblogpostsdelay_between_posts- Seconds between reblogs (0 for no delay)reblog_sensitive- Whether to boost sensitive/NSFW postsmax_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
- Poll FenLiu Queue - Get next curated post
- Validate - Quick checks (has content, not a reply, respects sensitive setting)
- Find on Fediverse - Search for post by URL
- Check for Duplicates - Compare attachments (URL, hash, perceptual)
- Reblog - Boost to your account with circuit breaker protection
- Report Feedback - ACK (success), NACK (transient error), ERROR (permanent)
- 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
Support
- Buy me coffee
- Monero:
88xtj3hqQEpXrb5KLCigRF1azxDh8r9XvYZPuXwaGaX5fWtgub1gQsn8sZCmEGhReZMww6RRaq5HZ48HjrNqmeccUHcwABg
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 zhongli-2026.4.5.tar.gz.
File metadata
- Download URL: zhongli-2026.4.5.tar.gz
- Upload date:
- Size: 20.6 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71524ec4f4e4772962521c129016868d5a567b024663ca668b0cca8bba34a2e1
|
|
| MD5 |
87e9b7173d05c846837c3ed7f2e9434d
|
|
| BLAKE2b-256 |
95dc783b9719b0275a482251e8286050768a0d82dec081652b627bccffa63e80
|
File details
Details for the file zhongli-2026.4.5-py3-none-any.whl.
File metadata
- Download URL: zhongli-2026.4.5-py3-none-any.whl
- Upload date:
- Size: 24.8 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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f35e5c0ac4e7502e745d35425f477d3c38a130c4aadf9b44ebc12e5610ae21da
|
|
| MD5 |
5437c6a8f3b6b332537ee92bd195cb30
|
|
| BLAKE2b-256 |
56b4cfc2c087f28b9a52cbb5fe09161420f73340a30f3619872f9456c03d24fc
|