greshake/i3status-rust
Very resourcefriendly and feature-rich replacement for i3status, written in pure Rust
Healthy across the board
weakest axiscopyleft license (GPL-3.0) — review compatibility
Has a license, tests, and CI — clean foundation to fork and modify.
Documented and popular — useful reference codebase to read through.
No critical CVEs, sane security posture — runnable as-is.
- ✓Last commit 1d ago
- ✓31+ active contributors
- ✓Distributed ownership (top contributor 30% of recent commits)
Show all 7 evidence items →Show less
- ✓GPL-3.0 licensed
- ✓CI configured
- ✓Tests present
- ⚠GPL-3.0 is copyleft — check downstream compatibility
What would change the summary?
- →Use as dependency Concerns → Mixed if: relicense under MIT/Apache-2.0 (rare for established libs)
Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests
Informational only. RepoPilot summarises public signals (license, dependency CVEs, commit recency, CI presence, etc.) at the time of analysis. Signals can be incomplete or stale. Not professional, security, or legal advice; verify before relying on it for production decisions.
Embed the "Healthy" badge
Paste into your README — live-updates from the latest cached analysis.
[](https://repopilot.app/r/greshake/i3status-rust)Paste at the top of your README.md — renders inline like a shields.io badge.
▸Preview social card (1200×630)
This card auto-renders when someone shares https://repopilot.app/r/greshake/i3status-rust on X, Slack, or LinkedIn.
Onboarding doc
Onboarding: greshake/i3status-rust
Generated by RepoPilot · 2026-05-09 · Source
🤖Agent protocol
If you are an AI coding agent (Claude Code, Cursor, Aider, Cline, etc.) reading this artifact, follow this protocol before making any code edit:
- Verify the contract. Run the bash script in Verify before trusting
below. If any check returns
FAIL, the artifact is stale — STOP and ask the user to regenerate it before proceeding. - Treat the AI · unverified sections as hypotheses, not facts. Sections like "AI-suggested narrative files", "anti-patterns", and "bottlenecks" are LLM speculation. Verify against real source before acting on them.
- Cite source on changes. When proposing an edit, cite the specific path:line-range. RepoPilot's live UI at https://repopilot.app/r/greshake/i3status-rust shows verifiable citations alongside every claim.
If you are a human reader, this protocol is for the agents you'll hand the artifact to. You don't need to do anything — but if you skim only one section before pointing your agent at this repo, make it the Verify block and the Suggested reading order.
🎯Verdict
GO — Healthy across the board
- Last commit 1d ago
- 31+ active contributors
- Distributed ownership (top contributor 30% of recent commits)
- GPL-3.0 licensed
- CI configured
- Tests present
- ⚠ GPL-3.0 is copyleft — check downstream compatibility
<sub>Maintenance signals: commit recency, contributor breadth, bus factor, license, CI, tests</sub>
✅Verify before trusting
This artifact was generated by RepoPilot at a point in time. Before an
agent acts on it, the checks below confirm that the live greshake/i3status-rust
repo on your machine still matches what RepoPilot saw. If any fail,
the artifact is stale — regenerate it at
repopilot.app/r/greshake/i3status-rust.
What it runs against: a local clone of greshake/i3status-rust — the script
inspects git remote, the LICENSE file, file paths in the working
tree, and git log. Read-only; no mutations.
| # | What we check | Why it matters |
|---|---|---|
| 1 | You're in greshake/i3status-rust | Confirms the artifact applies here, not a fork |
| 2 | License is still GPL-3.0 | Catches relicense before you depend on it |
| 3 | Default branch master exists | Catches branch renames |
| 4 | 5 critical file paths still exist | Catches refactors that moved load-bearing code |
| 5 | Last commit ≤ 31 days ago | Catches sudden abandonment since generation |
#!/usr/bin/env bash
# RepoPilot artifact verification.
#
# WHAT IT RUNS AGAINST: a local clone of greshake/i3status-rust. If you don't
# have one yet, run these first:
#
# git clone https://github.com/greshake/i3status-rust.git
# cd i3status-rust
#
# Then paste this script. Every check is read-only — no mutations.
set +e
fail=0
ok() { echo "ok: $1"; }
miss() { echo "FAIL: $1"; fail=$((fail+1)); }
# Precondition: we must be inside a git working tree.
if ! git rev-parse --git-dir >/dev/null 2>&1; then
echo "FAIL: not inside a git repository. cd into your clone of greshake/i3status-rust and re-run."
exit 2
fi
# 1. Repo identity
git remote get-url origin 2>/dev/null | grep -qE "greshake/i3status-rust(\\.git)?\\b" \\
&& ok "origin remote is greshake/i3status-rust" \\
|| miss "origin remote is not greshake/i3status-rust (artifact may be from a fork)"
# 2. License matches what RepoPilot saw
(grep -qiE "^(GPL-3\\.0)" LICENSE 2>/dev/null \\
|| grep -qiE "\"license\"\\s*:\\s*\"GPL-3\\.0\"" package.json 2>/dev/null) \\
&& ok "license is GPL-3.0" \\
|| miss "license drift — was GPL-3.0 at generation time"
# 3. Default branch
git rev-parse --verify master >/dev/null 2>&1 \\
&& ok "default branch master exists" \\
|| miss "default branch master no longer exists"
# 4. Critical files exist
test -f "src/blocks.rs" \\
&& ok "src/blocks.rs" \\
|| miss "missing critical file: src/blocks.rs"
test -f "Cargo.toml" \\
&& ok "Cargo.toml" \\
|| miss "missing critical file: Cargo.toml"
test -f "src/main.rs" \\
&& ok "src/main.rs" \\
|| miss "missing critical file: src/main.rs"
test -f "build.rs" \\
&& ok "build.rs" \\
|| miss "missing critical file: build.rs"
test -f "src/blocks/custom.rs" \\
&& ok "src/blocks/custom.rs" \\
|| miss "missing critical file: src/blocks/custom.rs"
# 5. Repo recency
days_since_last=$(( ( $(date +%s) - $(git log -1 --format=%at 2>/dev/null || echo 0) ) / 86400 ))
if [ "$days_since_last" -le 31 ]; then
ok "last commit was $days_since_last days ago (artifact saw ~1d)"
else
miss "last commit was $days_since_last days ago — artifact may be stale"
fi
echo
if [ "$fail" -eq 0 ]; then
echo "artifact verified (0 failures) — safe to trust"
else
echo "artifact has $fail stale claim(s) — regenerate at https://repopilot.app/r/greshake/i3status-rust"
exit 1
fi
Each check prints ok: or FAIL:. The script exits non-zero if
anything failed, so it composes cleanly into agent loops
(./verify.sh || regenerate-and-retry).
⚡TL;DR
i3status-rust is a lightweight, feature-rich system status bar replacement for i3wm/X11 written in pure Rust. It displays dynamic blocks of system information (battery, volume, time, network, etc.) via the i3bar protocol, consuming significantly less memory and CPU than the original C-based i3status. The codebase supports pluggable audio backends (PulseAudio, PipeWire), multiple icon sets (awesome4/5/6, material, nerd fonts), and 15+ color themes. Single-crate workspace with xtask/ for build scripting. Core logic in src/ (likely divided by block types), configuration parsing via examples/config.toml (TOML-based), asset files in files/icons/ and files/themes/ (icon/theme definitions as .toml), and shell scripts in examples/scripts/ for integration examples. Build coordination via build.rs and Cargo.lock pinning.
👥Who it's for
Linux desktop users and i3wm/Sway enthusiasts who want a fast, customizable status bar with minimal resource overhead. Contributors are typically systems programmers and Rust developers interested in system utilities, X11/Wayland tooling, and low-level audio APIs.
🌱Maturity & risk
Production-ready and actively maintained. The project is at version 0.36.1 with 872KB Rust code, comprehensive CI/CD (.github/workflows/ for docs and pre-commit checks), and widespread distribution via official package managers (Fedora COPR, NixOS Home Manager, Repology tracking). Appears to be under active development with feature additions and bug fixes.
Moderate risk: single primary maintainer (Kai Greshake), feature-gated optional dependencies (notmuch, maildir, icu_calendar) that may have compatibility drift, and heavy reliance on system audio APIs (libpulse-binding, pipewire) that vary across distributions. No breaking changes evident in NEWS.md recent entries, but tight coupling to i3bar protocol limits portability.
Active areas of work
Active development on theme/icon management (15+ themes in files/themes/), recent Catppuccin theme variants added (ctp-frappe/latte/macchiato/mocha), multi-backend audio support (PipeWire feature alongside PulseAudio), and documentation work (manual_install.md, themes.md). Pre-commit and docs workflows suggest ongoing code quality enforcement.
🚀Get running
git clone https://github.com/greshake/i3status-rust.git
cd i3status-rust
cargo build --release
./target/release/i3status-rs --config examples/config.toml
Note: Installation via cargo install is explicitly not supported; use the release binary or package managers.
Daily commands:
cargo build --release
# Run with example config:
cargo run --release -- --config examples/config.toml
# Or directly:
./target/release/i3status-rs
Does not daemonize by default; integrate with i3config via bar { status_command = "i3status-rs" }. Set $XDG_CONFIG_HOME/i3status-rust/config.toml for persistent config.
🗺️Map of the codebase
src/blocks.rs— Central registry that lists all available blocks and implements the core block loading/dispatch logic; essential for understanding how the status bar composes its information sources.Cargo.toml— Defines all conditional feature flags (pulseaudio, pipewire, notmuch, maildir, icu_calendar) that gate entire subsystems; contributors must understand feature dependencies before adding new blocks.src/main.rs— Entry point and main event loop; orchestrates block initialization, updates, and i3bar protocol output; critical for understanding request/response flow.build.rs— Build script that handles platform-specific compilation and icon/theme file embedding; necessary for cross-platform support and resource packaging.src/blocks/custom.rs— Generic custom block implementation pattern that most new blocks extend; serves as the template for adding user-defined executables and plugins.examples/config.toml— Canonical configuration example demonstrating all block types and their options; contributors use this to understand schema and validate new block features.files/themes— Pre-built theme definitions (TOML) that control visual styling across all blocks; understanding theme structure is critical for UI/styling enhancements.
🛠️How to make changes
Add a New System Monitoring Block
- Create a new module file in src/blocks/ following the pattern of src/blocks/cpu.rs, implementing the trait that provides update() and render() methods. (
src/blocks/new_metric.rs) - Add the module declaration to src/blocks.rs and register the new block in the main dispatcher with its configuration schema. (
src/blocks.rs) - Add an example configuration section to examples/config.toml showing required and optional parameters. (
examples/config.toml) - If the block has platform-specific code, add conditional compilation gates (e.g., #[cfg(target_os = "linux")]) in the new module. (
src/blocks/new_metric.rs)
Add a New Theme
- Create a new TOML file in files/themes/ (e.g., files/themes/my-theme.toml) with color definitions for all required block states (good, degraded, critical, idle). (
files/themes/my-theme.toml) - Reference the new theme name in examples/config.toml under the [theme] section to make it discoverable. (
examples/config.toml) - Generate and commit a screenshot preview image to img/themes/my-theme.png using the gen-screenshots/gen-screenshots.sh script. (
gen-screenshots/gen-screenshots.sh)
Add Conditional Feature Support (e.g., New Audio Backend)
- Add a new feature flag to [features] in Cargo.toml (e.g., feature = ["dep:my_audio_lib"] for optional dependencies). (
Cargo.toml) - Create or extend a block module with #[cfg(feature = "my_audio_lib")] gates to conditionally include the new backend implementation. (
src/blocks/audio_block.rs) - Update build.rs if the new feature requires compile-time checks or platform detection. (
build.rs) - Document the feature in README.md and doc/manual_install.md with build instructions (e.g., cargo build --features pipewire). (
doc/manual_install.md)
🔧Why these technologies
- Rust — Memory safety without GC and minimal runtime overhead; critical for a status bar that must run continuously with near-zero CPU usage. Compile-time trait system enables flexible block architecture.
- i3bar Protocol (JSON output) — Standard protocol for i3, Sway, and other i3-compatible window managers; enables interoperability and click handling without custom IPC.
- Conditional feature flags (Cargo features) — Users can customize builds for their environment (pulseaudio vs pipewire, calendar support optional); reduces binary size and dependencies for minimal installations.
- TOML for configuration and themes — Human-readable, supports nested structures, and integrates seamlessly with Rust's serde library for type-safe deserialization.
- D-Bus + system APIs (sysfs, /proc) — Native Linux integration; avoids polling-based hacks and leverages OS-level event notifications for battery, keyboard layout, and hardware state changes.
⚖️Trade-offs already made
-
No real-time event subscriptions; blocks are polled on a fixed interval (~1s default)
- Why: Simpler architecture, avoids complexity of async event coordination; acceptable latency for a status bar (user perceives ~1s granularity as normal).
- Consequence: CPU usage is predictable and bounded; cannot react sub-second to system changes. Trade throughput for simplicity.
-
All blocks are independent; no shared state or coordination layer
- Why: Avoids global locks and race conditions; each block manages its own update cycle and caching.
- Consequence: Some blocks may query overlapping OS resources (e.g., multiple CPU or disk blocks); minor inefficiency but negligible impact on resource-constrained devices.
-
Configuration is static at startup; no hot-reload of config or theme changes
- Why: Avoids complexity of safe runtime mutation and state invalidation; users expect to restart the bar on config changes anyway.
- Consequence: Changes to blocks or themes require killing and restarting the bar process; acceptable UX for a status bar.
-
Features are compile-time gates, not runtime plugins
- Why: Type safety and zero runtime overhead; avoids plugin loading infrastructure and versioning complexity.
- Consequence: Users must rebuild the binary to add new feature support (e.g., --features pipewire); trade flexibility for safety and simplicity.
🚫Non-goals (don't propose these)
- Does not provide authentication or secrets management; all integrations assume public or pre-authenticated access (e.g., GitHub token passed as env var).
- Not a real-time system; sub-100ms lat
🪤Traps & gotchas
- Installation via
cargo installis explicitly unsupported — must use pre-built binaries or package managers. 2) i3bar protocol compatibility is strict; output format must match exactly (JSON blocks with specific keys: name, instance, full_text, color, separator, separator_block_width). 3) Audio backend is compile-time feature-gated (pulseaudio default); pipewire requires explicit feature flag and native library. 4) Configuration path follows XDG spec ($XDG_CONFIG_HOME, not hardcoded ~/.config); non-standard setups may require path overrides via CLI flags. 5) Icon fonts (Nerd Font, Material) must be installed on system; missing glyphs silently display as missing characters. 6) PulseAudio/PipeWire socket communication may fail in containers or with unusual audio setup; fallback gracefully to dummy output.
🏗️Architecture
💡Concepts to learn
- i3bar Protocol — i3status-rust communicates with i3wm/Sway exclusively via JSON-formatted stdout using the i3bar protocol; understanding message structure (name, instance, full_text, color, separator_block_width) is essential for debugging output and adding blocks.
- Feature Gates (Rust) — The codebase uses Cargo features (pulseaudio, pipewire, notmuch, maildir, icu_calendar) for optional compile-time dependencies; understanding feature activation is critical for customizing builds and avoiding unused code bloat.
- Tokio Async Runtime — Blocks update asynchronously via tokio (evident from async-trait, futures dependencies); architecture avoids blocking the main bar update loop, enabling responsive status refreshes and concurrent I/O to system APIs.
- XDG Base Directory Specification — Configuration and state follow XDG conventions ($XDG_CONFIG_HOME, $XDG_CACHE_HOME, dirs crate); misunderstanding this can lead to config not being found or state persisted to wrong locations across distributions.
- [PulseAudio & PipeWire Audio APIs](https://www.freedesktop.org/wiki/Software/PulseAudio/ and https://pipewire.org/) — Audio blocks depend on low-level libpulse-binding or pipewire crates for volume/device introspection; feature selection at compile time affects which audio backend is available; socket communication may fail in restricted environments.
- Pango Markup for Text Styling — Icons and text are styled via Pango markup (e.g.,
<span font_family='NotoSans Nerd Font'>{icon}</span>); understanding Pango spans is necessary for custom icon formatting and font selection in theme definitions. - inotify for File Monitoring — The inotify crate (Linux-specific) watches config files and system state changes; blocks refresh efficiently on file changes rather than polling, reducing CPU usage.
🔗Related repos
polybar/polybar— Direct competitor: X11/Wayland status bar with C++ codebase, broader desktop environment support (supports lemonbar, i3bar, polybar-native), but heavier resource footprint.i3/i3status— Original C-based status bar that i3status-rust replaces; this repo is a ground-up Rust rewrite for performance and extensibility.sway/sway— Wayland i3 compositor that i3status-rust integrates with; users typically run both; check sway documentation for status_command examples.catppuccin/catppuccin— Community color scheme project; i3status-rust includes 4 Catppuccin variants (ctp-frappe/latte/macchiato/mocha) in files/themes/, follows their brand guidelines.ryanoasis/nerd-fonts— Icon font project that i3status-rust recommends for material-nf.toml and awesome6.toml icon sets; font must be installed for icons to render.
🪄PR ideas
To work on one of these in Claude Code or Cursor, paste:
Implement the "<title>" PR idea from CLAUDE.md, working through the checklist as the task list.
Add comprehensive block integration tests in tests/ directory
The repo has numerous blocks (battery, volume, time, weather, etc.) but no visible tests/ directory with integration tests. New contributors could create a test suite that validates block output parsing and formatting, especially for blocks with complex state management like battery thresholds, calendar recurrence, or maildir counting. This ensures blocks don't break during refactoring.
- [ ] Create tests/ directory structure mirroring src/blocks/
- [ ] Add integration tests for high-complexity blocks: maildir, notmuch, icalendar, pulseaudio
- [ ] Test TOML deserialization for each block's config in src/blocks/*/mod.rs
- [ ] Add tests validating the i3bar protocol output format from blocks/*/output.rs
- [ ] Document test patterns in CONTRIBUTING.md
Create missing documentation for theme and icon customization in doc/
The repo has 17 pre-built themes in files/themes/ and 6 icon sets in files/icons/, but doc/themes.md appears to be the only theme documentation. New contributors should document: (1) how to create custom themes by extending existing .toml files, (2) the complete color/formatting schema reference, (3) how to create custom icon sets and map them to blocks. This directly supports user extensibility.
- [ ] Create doc/custom-themes.md with theme schema reference (colors, underline, bold, etc.)
- [ ] Create doc/custom-icons.md explaining icon set structure and mapping icons to blocks
- [ ] Add examples/ config snippets showing theme/icon overrides
- [ ] Document the metadata format in files/themes/.toml and files/icons/.toml
- [ ] Add troubleshooting section for common customization issues
Add GitHub Actions workflow to validate example configs and themes
The repo has .github/workflows/ with docs.yml and pre-commit.yml, but no validation workflow. New contributors should add a CI job that: (1) validates examples/config.toml against the schema, (2) validates all files/themes/.toml and files/icons/.toml for TOML syntax, (3) tests that config deserialization doesn't panic. This catches breaking changes early and maintains config/theme integrity.
- [ ] Create .github/workflows/validate-configs.yml
- [ ] Add step to validate examples/config.toml using serde_json/toml crate
- [ ] Add step to validate all files/themes/*.toml syntax (use cargo-toml or manual parsing)
- [ ] Add step to validate all files/icons/*.toml for correct icon key structure
- [ ] Test that invalid configs fail gracefully without panics in build.rs
🌿Good first issues
- Add shell completion generation: Cargo.toml includes clap 4.0 with derive features; generate bash/zsh/fish completions in build.rs and ship in release, similar to how themes/icons are bundled. See Cargo.toml [package.metadata] section for precedent.
- Document block parameter validation: examples/config.toml has many blocks with optional/required fields; add inline comments or create doc/blocks-reference.md listing each block, required keys, and validation rules (e.g., 'interval must be ≥1s'). Currently only visible via source code or trial/error.
- Add unit tests for TOML parsing: Cargo.lock and Cargo.toml parsing logic likely lacks test coverage; create tests/config_parsing.rs with valid/invalid config fixtures to catch regressions in theme/icon TOML deserialization, especially for feature-gated blocks (notmuch, maildir).
⭐Top contributors
Click to expand
Top contributors
- @bim9262 — 30 commits
- @ammgws — 23 commits
- @zheltikov — 7 commits
- @dependabot[bot] — 5 commits
- @bpeetz — 3 commits
📝Recent commits
Click to expand
Recent commits
56792f3— Merge pull request #2266 from cdbrkfxrpt/master (ammgws)73c76f4— Merge pull request #2272 from obaibula/master (ammgws)1891621— fix: remove whitespace and rephrase to satisfy CSpell in CI (obaibula)a41baeb— docs: fix Intel GPU Usage in examples/README.md (obaibula)5e42b5b— build(deps): bump rustls-webpki from 0.103.10 to 0.103.13 (dependabot[bot])02003a2— build(deps): bump openssl from 0.10.72 to 0.10.78 (dependabot[bot])a988d2e— build(deps): bump rand from 0.8.5 to 0.8.6 (dependabot[bot])7d6d3c3— refactor(weather): extractget_location_queryinto a free function (cdbrkfxrpt)e8737c0— fix(weather): avoid percent-encoding commas in place name geocoding (cdbrkfxrpt)3ac2d4d— block[calendar]: use icalendar recurrence feature (bim9262)
🔒Security observations
The codebase demonstrates generally good security practices with proper use of Rust and feature-gating of optional dependencies. However, there are critical configuration errors in Cargo.toml (invalid edition 2024, resolver version 3, and truncated dependencies) that must be corrected. These appear to be metadata/configuration issues rather than code security vulnerabilities. The project uses a GPL-3.0 license, has no apparent hardcoded secrets, and follows standard Rust security practices. No direct injection risks, authentication issues, or infrastructure vulnerabilities were identified from the visible file structure. The main concerns are the build configuration problems that could prevent the project from compiling correctly.
- Medium · Invalid Rust Edition in Cargo.toml —
Cargo.toml. The Cargo.toml specifies edition = '2024', which does not exist. Valid editions are 2015, 2018, and 2021. This is likely a configuration error that could cause build failures or unexpected behavior. Fix: Change edition to '2021' (or '2018' if targeting older toolchain compatibility). This is a critical configuration issue that needs immediate correction. - Medium · Incomplete Dependency Declaration —
Cargo.toml. The Cargo.toml file appears to be truncated mid-dependency (ends with 'lo' at the libpulse-binding section). This incomplete configuration could cause build failures or missing critical dependencies. Fix: Complete the Cargo.toml file with all required dependencies. Ensure all dependency entries are properly closed and formatted. - Low · Insecure Resolver Version —
Cargo.toml. The workspace uses resolver = '3', which does not exist. Valid resolver versions are 1 and 2. This could cause unexpected dependency resolution behavior. Fix: Change to resolver = '2' which is the current standard resolver with improved dependency resolution. Alternatively, remove the line to use the default resolver. - Low · Potential Information Disclosure via Documentation —
Cargo.toml [package.metadata.docs.rs]. The build configuration includes features for documentation generation that expose some library features (maildir, notmuch). While not directly a vulnerability, this could aid attackers in understanding the application's capabilities. Fix: Review what features are exposed in public documentation and consider limiting feature visibility if sensitive capabilities are included. - Low · Optional Feature Dependencies Not Clearly Documented —
Cargo.toml [features] section. Several optional dependencies (notmuch, maildir, icu_calendar, pipewire) are feature-gated but the security implications of enabling these features are not documented. Fix: Document the security implications and dependencies of each optional feature. Ensure users understand what they're enabling when they use these features.
LLM-derived; treat as a starting point, not a security audit.
👉Where to read next
- Open issues — current backlog
- Recent PRs — what's actively shipping
- Source on GitHub
Generated by RepoPilot. Verdict based on maintenance signals — see the live page for receipts. Re-run on a new commit to refresh.