Thanks for contributing to the xfetch effects ecosystem. This repository contains official effects and the reference implementations for building new ones.
- Fork the repository and create a feature branch.
- Create a new effect crate under
effects/<name>/. - Add it to the workspace
membersin Cargo.toml. - Run
cargo test --workspaceandcargo build --workspace. - Document the effect in its own
README.md(build, install, config, protocol) and add it to the table in README.md. - Add a short entry to the effect's
CHANGELOG.md. - Open a pull request with usage details and any required dependencies. PRs that do not compile or fail tests are rejected.
- Use the binary naming convention
xfetch-effect-<name>. - Keep effects focused on a single visual idea.
- Write errors to stderr and exit with a non-zero status on failure.
-
Never break ANSI escape sequences. The rendered lines carry
colors and icons; tokenize them with
xfetch-effects-lib(tokenize/rebuild) and only transform the visible characters. A partial escape sequence makes the terminal interpret it and leaks garbage onto the screen — this is enforced by the effects-lib tests. -
Every effect MUST have a runtime limit. Wrap all work in
with_timeout(fromxfetch_effect_api) with aconst BUDGETthat fits the work. An effect without a timeout is rejected: it could hang xfetch forever. - Prefer deterministic output (seeded) so tests are stable.
- The last frame should reach the final (unmodified) content.
- Prefer stable, actively maintained dependencies and keep them minimal.
The wire protocol (xfetch-effect-api) is documented in
effect-sdk.md
and the protocol reference.
Shared ANSI-safe helpers live in effects/effects-lib — reuse them
instead of reimplementing the tokenizer.
Be respectful, constructive, and collaborative. Harassment, trolling, and personal attacks are not tolerated.