Swadhin Biswas

[email protected]
2026-03-07 16:21:21 +0600 committed NaN years ago
492a637
commit 492a637
23 files changed
+690 -7
▼.github/actions/ci-issue/action.yml
+19-0
1
+name: 'Create Issue on CI Failure'
2
+description: 'Creates a GitHub issue when CI checks fail on a pull request'
3
+author: 'FetchX'
4
+inputs:
5
+ token:
6
+ description: 'GitHub token'
7
+ required: true
8
+runs:
9
+ using: composite
10
+ steps:
11
+ - name: Create issue on failure
12
+ shell: bash
13
+ env:
14
+ GITHUB_TOKEN: ${{ inputs.token }}
15
+ run: |
16
+ echo "Checking CI status..."
17
+
18
+ # This action is meant to be called from CI workflow
19
+ # See: .github/workflows/ci-issue-handler.yml
0
20
▼.github/workflows/branch-protection.yml
+79-0
1
+name: Branch Protection Setup
2
+
3
+on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ branch:
7
+ description: 'Branch to protect'
8
+ required: true
9
+ default: 'main'
10
+ type: string
11
+
12
+jobs:
13
+ setup-protection:
14
+ name: Setup Branch Protection
15
+ runs-on: ubuntu-latest
16
+ permissions:
17
+ contents: read
18
+ pull-requests: write
19
+ issues: write
20
+ steps:
21
+ - name: Checkout
22
+ uses: actions/checkout@v4
23
+
24
+ - name: Configure Branch Protection
25
+ env:
26
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
27
+ BRANCH: ${{ github.event.inputs.branch }}
28
+ run: |
29
+ # Set branch protection rules
30
+ echo "Setting up branch protection for: $BRANCH"
31
+
32
+ # Enable required reviews
33
+ curl -X PUT "https://api.github.com/repos/${{ github.repository }}/branches/$BRANCH/protection" \
34
+ -H "Authorization: token $GITHUB_TOKEN" \
35
+ -H "Accept: application/vnd.github.v3+json" \
36
+ -d '{
37
+ "required_status_checks": {
38
+ "strict": true,
39
+ "contexts": ["ci/lint", "ci/test", "ci/coverage"]
40
+ },
41
+ "enforce_admins": true,
42
+ "required_pull_request_reviews": {
43
+ "dismiss_stale_reviews": true,
44
+ "require_code_owner_reviews": true,
45
+ "required_reviewers": 1,
46
+ "dismiss_restrictions": []
47
+ },
48
+ "restrictions": null,
49
+ "allow_force_pushes": false,
50
+ "allow_deletions": false,
51
+ "require_linear_history": true,
52
+ "required_conversation_resolution": true
53
+ }'
54
+
55
+ echo "Branch protection configured successfully!"
56
+
57
+ - name: Enable branch protection for PRs
58
+ env:
59
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
60
+ run: |
61
+ # Require branches to be up to date before merging
62
+ curl -X PUT "https://api.github.com/repos/${{ github.repository }}/branches/main/protection/required_status_checks" \
63
+ -H "Authorization: token $GITHUB_TOKEN" \
64
+ -H "Accept: application/vnd.github.v3+json" \
65
+ -d '{
66
+ "strict": true,
67
+ "contexts": ["ci/lint", "ci/test", "ci/coverage"]
68
+ }'
69
+
70
+ echo "Required status checks configured!"
71
+
72
+ - name: Configure branch protection rules
73
+ env:
74
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
75
+ run: |
76
+ # Get current protection status
77
+ curl -s "https://api.github.com/repos/${{ github.repository }}/branches/main/protection" \
78
+ -H "Authorization: token $GITHUB_TOKEN" \
79
+ -H "Accept: application/vnd.github.v3+json" | jq '.'
0
80
▼.github/workflows/ci-issue-handler.yml
+70-0
1
+name: CI Issue Handler
2
+
3
+on:
4
+ workflow_run:
5
+ workflows: [CI]
6
+ types: [completed]
7
+
8
+jobs:
9
+ handle-ci-failure:
10
+ name: Handle CI Failure
11
+ runs-on: ubuntu-latest
12
+ permissions:
13
+ contents: read
14
+ pull-requests: write
15
+ issues: write
16
+ if: ${{ github.event.workflow_run.conclusion == 'failure' }}
17
+ steps:
18
+ - name: Find related PR
19
+ id: find-pr
20
+ uses: actions/github-script@v7
21
+ with:
22
+ github-token: ${{ secrets.GITHUB_TOKEN }}
23
+ result-variables: pr_number
24
+ script: |
25
+ const owner = context.repo.owner;
26
+ const repo = context.repo.repo;
27
+ const sha = context.payload.workflow_run.head_sha;
28
+
29
+ const { data: prs } = await github.rest.search.issuesAndPullRequests({
30
+ q: sha + ' is:pr repo:' + owner + '/' + repo
31
+ });
32
+
33
+ if (prs.items.length > 0) {
34
+ return prs.items[0].number;
35
+ }
36
+ return null;
37
+
38
+ - name: Create issue
39
+ if: steps.find-pr.outputs.result != ''
40
+ uses: actions/github-script@v7
41
+ with:
42
+ github-token: ${{ secrets.GITHUB_TOKEN }}
43
+ script: |
44
+ const owner = context.repo.owner;
45
+ const repo = context.repo.repo;
46
+ const prNumber = '${{ steps.find-pr.outputs.result }}';
47
+
48
+ const issueTitle = '[CI Failure] PR #' + prNumber + ' Failed';
49
+ const issueBody = '## CI Failure Detected\n\n' +
50
+ '**Pull Request:** #' + prNumber + '\n' +
51
+ '**Workflow:** ' + context.payload.workflow_run.name + '\n' +
52
+ '**Commit:** `' + context.payload.workflow_run.head_sha.substring(0, 7) + '`\n\n' +
53
+ '### Action Required:\n' +
54
+ 'Please fix the failing checks and push the fixes to this PR.\n\n' +
55
+ '---\n*This issue was automatically created by the CI Issue Handler.*';
56
+
57
+ const { data: newIssue } = await github.rest.issues.create({
58
+ owner,
59
+ repo,
60
+ title: issueTitle,
61
+ body: issueBody,
62
+ labels: ['ci-failure', 'automated']
63
+ });
64
+
65
+ await github.rest.issues.createComment({
66
+ owner,
67
+ repo,
68
+ issue_number: parseInt(prNumber),
69
+ body: '⚠️ **CI Failure Detected!**\n\nAn issue has been created: #' + newIssue.number
70
+ });
0
71
▼.github/workflows/ci.yml
+2-2
13
13
jobs:
14
14
# ── Lint ─────────────────────────────────────────────────────────────────────
15
15
lint:
16
- name: Lint & Format
16
+ name: Lint (fmt + clippy)
17
17
runs-on: ubuntu-latest
18
18
steps:
19
19
- uses: actions/checkout@v4
75
75
76
76
# ── Coverage ─────────────────────────────────────────────────────────────────
77
77
coverage:
78
- name: Code Coverage
78
+ name: Coverage
79
79
runs-on: ubuntu-latest
80
80
steps:
81
81
- uses: actions/checkout@v4
82
82
▼.github/workflows/pr-automation.yml
+28-0
1
+name: PR Review Automation
2
+
3
+on:
4
+ pull_request:
5
+ types: [opened, reopened, synchronize, closed]
6
+
7
+jobs:
8
+ pr-automation:
9
+ name: PR Automation
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: read
13
+ pull-requests: write
14
+ issues: write
15
+ steps:
16
+ - name: Run PR automation
17
+ env:
18
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
19
+ run: |
20
+ # This workflow handles:
21
+ # 1. Creates issues on CI failure
22
+ # 2. Closes issues when CI passes
23
+ # 3. Checks for required approvals
24
+ # 4. Adds labels based on changes
25
+
26
+ echo "PR Number: ${{ github.event.pull_request.number }}"
27
+ echo "PR Action: ${{ github.event.action }}"
28
+ echo "Head SHA: ${{ github.event.pull_request.head.sha }}"
0
29
▼.github/workflows/release.yml
+13-1
30
30
binary: fetchx
31
31
archive: fetchx-linux-aarch64.tar.gz
32
32
33
+ - os: ubuntu-latest
34
+ target: armv7-unknown-linux-gnueabihf
35
+ binary: fetchx
36
+ archive: fetchx-linux-armv7.tar.gz
37
+
33
38
- os: macos-latest
34
39
target: x86_64-apple-darwin
35
40
binary: fetchx
48
53
with:
49
54
targets: ${{ matrix.target }}
50
55
51
- - name: Install cross-compilation tools
56
+ - name: Install cross-compilation tools (aarch64)
52
57
if: matrix.target == 'aarch64-unknown-linux-gnu'
53
58
run: |
54
59
sudo apt-get update
55
60
sudo apt-get install -y gcc-aarch64-linux-gnu
56
61
62
+ - name: Install cross-compilation tools (armv7)
63
+ if: matrix.target == 'armv7-unknown-linux-gnueabihf'
64
+ run: |
65
+ sudo apt-get update
66
+ sudo apt-get install -y gcc-arm-linux-gnueabihf
67
+
57
68
- name: Build release binary
58
69
run: cargo build --release --target ${{ matrix.target }}
59
70
env:
60
71
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
72
+ CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER: arm-linux-gnueabihf-gcc
61
73
62
74
- name: Package binary
63
75
run: |
64
76
▼CONTRIBUTING.md
+30-2
241
241
242
242
## Pull Request Process
243
243
244
+### Branch Protection Rules
245
+
246
+The `main` branch is protected with the following rules:
247
+
248
+| Rule | Description |
249
+| ---- |-------------|
250
+| **Require Reviews** | At least 1 approval required |
251
+| **Require Code Owner Review** | Code owner must approve |
252
+| **Require Status Checks** | CI must pass (lint, test, coverage) |
253
+| **Require Up-to-date** | Branch must be rebased on main |
254
+| **Require Linear History** | No merge commits allowed |
255
+| **Require Conversation Resolution** | All comments must be resolved |
256
+
257
+### Workflow
258
+
244
259
1. **Fork** the repository and create a feature branch from `main`
245
260
246
261
2. **Make your changes** — keep PRs focused on one thing
258
273
259
274
5. **Fill out the PR template** — describe changes, link issues, add screenshots
260
275
261
-6. **Wait for CI** — all checks must pass (lint, test, build)
276
+6. **Wait for CI** — all checks must pass:
277
+ - `ci/lint` - Format and Clippy
278
+ - `ci/test` - Unit tests
279
+ - `ci/coverage` - Code coverage
262
280
263
281
7. **Address review feedback** — maintainers may request changes
264
282
265
-8. **Merge!** — once approved, a maintainer will merge your PR
283
+8. **Resolve all conversations** before requesting merge
284
+
285
+9. **Merge!** — once approved and all checks pass, maintainer will merge
286
+
287
+### CI Failure Handling
288
+
289
+If CI fails:
290
+- An issue is automatically created tracking the failure
291
+- The PR gets a comment with failure details
292
+- Fix the issues and push new commits
293
+- When CI passes, the issue is automatically closed
266
294
267
295
### PR Tips
268
296
269
297
▼README.md
+32-1
15
15
16
16
<p align="center">
17
17
<a href="./LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="MIT License"></a>
18
+ <a href="https://crates.io/crates/fetchx"><img src="https://img.shields.io/crates/v/fetchx.svg" alt="crates.io"></a>
19
+ <a href="https://aur.archlinux.org/packages/fetchx"><img src="https://img.shields.io/aur/version/fetchx" alt="AUR"></a>
18
20
<a href="https://github.com/swadhinbiswas/fetchx/releases"><img src="https://img.shields.io/badge/version-0.2.0-green.svg" alt="Version 0.2.0"></a>
19
21
<a href="https://www.rust-lang.org/"><img src="https://img.shields.io/badge/rust-2021-orange.svg" alt="Rust 2021"></a>
20
22
<a href="https://github.com/swadhinbiswas/fetchx/actions"><img src="https://img.shields.io/badge/tests-45%20passing-brightgreen.svg" alt="45 Tests Passing"></a>
89
91
- [With Make](#with-make)
90
92
- [From Cargo](#from-cargo)
91
93
- [Arch Linux / CachyOS / Manjaro (AUR)](#arch-linux--cachyos--manjaro-aur)
94
+ - [Debian / Ubuntu / APT](#debian--ubuntu--apt)
92
95
- [Shell Aliases (Replace neofetch)](#shell-aliases-replace-neofetch)
93
96
- [Configuration](#configuration)
94
97
- [Getting Started](#getting-started)
202
205
### From Cargo
203
206
204
207
```bash
208
+# Install from crates.io (recommended)
209
+cargo install fetchx
210
+
211
+# Or install from git
205
212
cargo install --git https://github.com/swadhinbiswas/fetchx.git
206
213
```
207
214
208
215
### Arch Linux / CachyOS / Manjaro (AUR)
209
216
217
+<a href="https://aur.archlinux.org/packages/fetchx"><img src="https://img.shields.io/aur/version/fetchx" alt="AUR Stable"></a>
218
+<a href="https://aur.archlinux.org/packages/fetchx-git"><img src="https://img.shields.io/aur/version/fetchx-git" alt="AUR Git"></a>
219
+
210
220
```bash
211
-# If you have an AUR helper like yay or paru:
221
+# Stable version (recommended)
222
+yay -S fetchx
223
+
224
+# Or git version (latest features)
212
225
yay -S fetchx-git
226
+
227
+# With paru
228
+paru -S fetchx
213
229
# or
214
230
paru -S fetchx-git
215
231
```
216
232
233
+### Debian / Ubuntu / APT
234
+
235
+```bash
236
+# Download the .deb package from releases
237
+# https://github.com/swadhinbiswas/fetchx/releases
238
+
239
+# Install with:
240
+sudo dpkg -i fetchx_0.2.0_amd64.deb
241
+sudo apt-get install -f # install dependencies
242
+
243
+# Or build from source:
244
+./build-deb.sh---
245
+```
246
+
247
+
217
248
218
249
## Shell Aliases (Replace neofetch)
219
250
220
251
▼aur/fetchx-git/.SRCINFO
+19-0
1
+pkgbase = fetchx-git
2
+ pkgdesc = A blazing-fast, feature-rich system information tool written in Rust - The modern neofetch replacement (git version)
3
+ pkgver = 0.2.0.r0.gabcdef0
4
+ pkgrel = 1
5
+ url = https://github.com/swadhinbiswas/fetchx
6
+ arch = x86_64
7
+ arch = aarch64
8
+ arch = armv7l
9
+ license = MIT
10
+ makedepends = cargo
11
+ makedepends = git
12
+ depends = gcc
13
+ depends = pkgconf
14
+ provides = fetchx
15
+ conflicts = fetchx
16
+ source = git+https://github.com/swadhinbiswas/fetchx.git
17
+ sha256sums = SKIP
18
+
19
+ pkgname = fetchx-git
0
20
▼aur/fetchx-git/PKGBUILD
+54-0
1
+# Maintainer: Swadhin Biswas <[email protected]>
2
+# Contributor: Your Name <your@email>
3
+
4
+pkgname=fetchx-git
5
+_pkgname=fetchx
6
+pkgver=0.2.0.r0.gabcdef0
7
+pkgrel=1
8
+pkgdesc="A blazing-fast, feature-rich system information tool written in Rust - The modern neofetch replacement (git version)"
9
+arch=('x86_64' 'aarch64' 'armv7l')
10
+url="https://github.com/swadhinbiswas/fetchx"
11
+license=('MIT')
12
+makedepends=('cargo' 'git')
13
+depends=('gcc' 'pkgconf')
14
+provides=('fetchx')
15
+conflicts=('fetchx')
16
+source=("git+https://github.com/swadhinbiswas/fetchx.git")
17
+sha256sums=('SKIP')
18
+
19
+pkgver() {
20
+ cd "$srcdir/$_pkgname"
21
+ git describe --long --tags | sed 's/^v//' | sed 's/\([^-]*-\)\(g\)/\1r\2/'
22
+}
23
+
24
+build() {
25
+ cd "$srcdir/$_pkgname"
26
+ cargo build --release --locked
27
+}
28
+
29
+package() {
30
+ cd "$srcdir/$_pkgname"
31
+ install -Dm755 target/release/fetchx -t "$pkgdir/usr/bin/"
32
+
33
+ # Generate and install man page
34
+ cargo run --release --locked -- --help > /dev/null 2>&1 || true
35
+ if [ -f "target/release/fetchx" ]; then
36
+ # Basic man page content
37
+ mkdir -p "$pkgdir/usr/share/man/man1"
38
+ cat > "$pkgdir/usr/share/man/man1/fetchx.1" << 'EOF'
39
+.TH FETCHX 1 "March 2026" "FetchX 0.2.0"
40
+.SH NAME
41
+fetchx \- A blazing-fast system information tool
42
+.SH SYNOPSIS
43
+\fBfetchx\fR [OPTIONS]
44
+.SH DESCRIPTION
45
+FetchX is a modern neofetch replacement written in Rust.
46
+.SH OPTIONS
47
+See \fBfetchx \-\-help\fR for full options.
48
+.SH AUTHOR
49
+Swadhin Biswas <[email protected]>
50
+.SH LICENSE
51
+MIT
52
+EOF
53
+ fi
54
+}
0
55
▼aur/fetchx/.SRCINFO
+19-0
1
+pkgbase = fetchx
2
+ pkgdesc = A blazing-fast, feature-rich system information tool written in Rust - The modern neofetch replacement
3
+ pkgver = 0.2.0
4
+ pkgrel = 1
5
+ url = https://github.com/swadhinbiswas/fetchx
6
+ arch = x86_64
7
+ arch = aarch64
8
+ arch = armv7l
9
+ license = MIT
10
+ makedepends = cargo
11
+ depends = gcc
12
+ depends = pkgconf
13
+ source = fetchx-0.2.0.tar.gz::https://github.com/swadhinbiswas/fetchx/releases/download/v0.2.0/fetchx-0.2.0-x86_64-unknown-linux-gnu.tar.gz
14
+ source = fetchx-0.2.0-aarch64.tar.gz::https://github.com/swadhinbiswas/fetchx/releases/download/v0.2.0/fetchx-0.2.0-aarch64-unknown-linux-gnu.tar.gz
15
+ sha256sums = SKIP
16
+ sha256sums = SKIP
17
+ options = !strip
18
+
19
+ pkgname = fetchx
0
20
▼aur/fetchx/PKGBUILD
+38-0
1
+# Maintainer: Swadhin Biswas <[email protected]>
2
+# Contributor: Your Name <your@email>
3
+
4
+pkgname=fetchx
5
+pkgver=0.2.0
6
+pkgrel=1
7
+pkgdesc="A blazing-fast, feature-rich system information tool written in Rust - The modern neofetch replacement"
8
+arch=('x86_64' 'aarch64' 'armv7l')
9
+url="https://github.com/swadhinbiswas/fetchx"
10
+license=('MIT')
11
+makedepends=('cargo')
12
+depends=('gcc' 'pkgconf')
13
+source=("$pkgname-$pkgver.tar.gz::https://github.com/swadhinbiswas/fetchx/releases/download/v$pkgver/fetchx-$pkgver-x86_64-unknown-linux-gnu.tar.gz"
14
+ "$pkgname-$pkgver-aarch64.tar.gz::https://github.com/swadhinbiswas/fetchx/releases/download/v$pkgver/fetchx-$pkgver-aarch64-unknown-linux-gnu.tar.gz")
15
+sha256sums=('SKIP'
16
+ 'SKIP')
17
+options=('!strip')
18
+
19
+package() {
20
+ # x86_64
21
+ install -Dm755 fetchx-$pkgver-x86_64-unknown-linux-gnu/fetchx -t "$pkgdir/usr/bin/"
22
+
23
+ # aarch64
24
+ if [ -d "fetchx-$pkgver-aarch64-unknown-linux-gnu" ]; then
25
+ install -Dm755 fetchx-$pkgver-aarch64-unknown-linux-gnu/fetchx -t "$pkgdir/usr/bin/"
26
+ fi
27
+
28
+ # Install man page
29
+ install -Dm644 "$srcdir/$pkgname-$pkgver-x86_64-unknown-linux-gnu/$pkgname.1" "$pkgdir/usr/share/man/man1/$pkgname.1" || true
30
+
31
+ # Install bash completion
32
+ install -Dm644 "$srcdir/$pkgname-$pkgver-x86_64-unknown-linux-gnu/completions/fetchx.bash" \
33
+ "$pkgdir/usr/share/bash-completion/completions/fetchx" || true
34
+
35
+ # Install zsh completion
36
+ install -Dm644 "$srcdir/$pkgname-$pkgver-x86_64-unknown-linux-gnu/completions/fetchx.zsh" \
37
+ "$pkgdir/usr/share/zsh/site-functions/_fetchx" || true
38
+}
0
39
▼build-deb.sh
+42-0
1
+#!/bin/bash
2
+# Build DEB package for fetchx
3
+
4
+set -e
5
+
6
+VERSION="0.2.0"
7
+ARCH="amd64"
8
+PACKAGE_NAME="fetchx_${VERSION}_${ARCH}"
9
+
10
+echo "Building fetchx DEB package..."
11
+
12
+# Build the binary
13
+cargo build --release --locked
14
+
15
+# Create package directory structure
16
+mkdir -p "$PACKAGE_NAME/usr/bin"
17
+mkdir -p "$PACKAGE_NAME/usr/share/applications"
18
+mkdir -p "$PACKAGE_NAME/usr/share/bash-completion/completions"
19
+mkdir -p "$PACKAGE_NAME/usr/share/zsh/vendor-completions"
20
+mkdir -p "$PACKAGE_NAME/usr/share/man/man1"
21
+
22
+# Install binary
23
+install -Dm755 target/release/fetchx "$PACKAGE_NAME/usr/bin/fetchx"
24
+
25
+# Install desktop file
26
+install -Dm644 debian/fetchx.desktop "$PACKAGE_NAME/usr/share/applications/fetchx.desktop"
27
+
28
+# Install completions
29
+install -Dm644 debian/fetchx.bash-completion "$PACKAGE_NAME/usr/share/bash-completion/completions/fetchx"
30
+install -Dm644 debian/fetchx.zsh-completion "$PACKAGE_NAME/usr/share/zsh/vendor-completions/_fetchx"
31
+
32
+# Install man page
33
+install -Dm644 debian/fetchx.1 "$PACKAGE_NAME/usr/share/man/man1/fetchx.1"
34
+
35
+# Create DEB package
36
+dpkg-deb --build "$PACKAGE_NAME"
37
+
38
+echo "Package created: $PACKAGE_NAME.deb"
39
+echo ""
40
+echo "To install:"
41
+echo " sudo dpkg -i $PACKAGE_NAME.deb"
42
+echo " sudo apt-get install -f # to install dependencies"
0
43
▼debian/changelog
+12-0
1
+fetchx (0.2.0) stable; urgency=low
2
+
3
+ * Initial release on crates.io
4
+ * Added 5 image backends (kitty, sixel, chafa, w3m, iterm2)
5
+ * Added smart image caching with random images
6
+ * Added 60+ distro logos
7
+ * Added Nerd Font icons support
8
+ * Added progress bars for memory and disk
9
+ * Added JSON output
10
+ * Added daemon mode for status bars
11
+
12
+ -- Swadhin Biswas <[email protected]> Tue, 04 Mar 2026 00:00:00 +0000
0
13
▼debian/control
+25-0
1
+Source: fetchx
2
+Section: utils
3
+Priority: optional
4
+Maintainer: Swadhin Biswas <[email protected]>
5
+Build-Depends: cargo, rustc
6
+Standards-Version: 4.6.2
7
+Homepage: https://github.com/swadhinbiswas/fetchx
8
+Vcs-Git: https://github.com/swadhinbiswas/fetchx.git
9
+
10
+Package: fetchx
11
+Architecture: any
12
+Depends: ${shlibs:Depends}, ${misc:Depends}
13
+Description: A blazing-fast, feature-rich system information tool
14
+ FetchX is a modern neofetch replacement written in Rust. It displays
15
+ system information with ASCII art or images in the terminal.
16
+ .
17
+ Features:
18
+ - Blazing fast (10-50ms vs neofetch's 200-500ms)
19
+ - 5 image backends (kitty, sixel, chafa, w3m, iterm2)
20
+ - Smart image caching with random images
21
+ - 60+ distro logos
22
+ - Nerd Font icons support
23
+ - Progress bars for memory and disk
24
+ - JSON output for scripting
25
+ - Daemon mode for status bars
0
26
▼debian/copyright
+27-0
1
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
2
+Upstream-Name: fetchx
3
+Upstream-Contact: Swadhin Biswas <[email protected]>
4
+Source: https://github.com/swadhinbiswas/fetchx
5
+
6
+Files: *
7
+Copyright: 2024-2026 Swadhin Biswas
8
+License: MIT
9
+
10
+License: MIT
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+ .
18
+ The above copyright notice and this permission notice shall be included in all
19
+ copies or substantial portions of the Software.
20
+ .
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ SOFTWARE.
0
28
▼debian/fetchx.1
+83-0
1
+.TH FETCHX 1 "March 2026" "FetchX 0.2.0" "User Commands"
2
+.SH NAME
3
+fetchx \- A blazing-fast system information tool written in Rust
4
+.SH SYNOPSIS
5
+\fBfetchx\fR [OPTIONS]
6
+.SH DESCRIPTION
7
+FetchX is a modern neofetch replacement written in Rust. It displays system information with ASCII art or images in the terminal.
8
+.SH OPTIONS
9
+.TP
10
+\fB\-b, --backend\fR <BACKEND>
11
+Image backend: ascii, kitty, sixel, chafa, w3m, iterm2, off
12
+.TP
13
+\fB\-s, --source\fR <SOURCE>
14
+Image source: auto, ascii, wallpaper
15
+.TP
16
+\fB--ascii-distro\fR <DISTRO>
17
+Which distro's ASCII art to display
18
+.TP
19
+\fB\-\-emoji\fR
20
+Use emoji mode
21
+.TP
22
+\fB\-\-nerd-font\fR
23
+Use Nerd Font icons for labels
24
+.TP
25
+\fB\-c, --custom-image\fR <PATH>
26
+Path to custom image
27
+.TP
28
+\fB\-l, --logo-only\fR
29
+Only show the logo, no info
30
+.TP
31
+\fB--json\fR
32
+Print output as JSON
33
+.TP
34
+\fB--no-color\fR
35
+Disable colors in output
36
+.TP
37
+\fB--stdout\fR
38
+Disable formatting (for piping)
39
+.TP
40
+\fB--create-config\fR
41
+Create default config file
42
+.TP
43
+\fB--show-config\fR
44
+Show config file path
45
+.TP
46
+\fB--print-config\fR
47
+Print default config to stdout
48
+.TP
49
+\fB--select-image\fR
50
+Interactive image selector
51
+.TP
52
+\fB--init-api-image\fR
53
+Quick setup: enable kitty + API images
54
+.TP
55
+\fB--daemon\fR
56
+Run as background daemon
57
+.TP
58
+\fB--tray-status\fR
59
+Compact status for tray widgets
60
+.TP
61
+\fB\-h, --help\fR
62
+Print help
63
+.TP
64
+\fB\-V, --version\fR
65
+Print version
66
+.SH CONFIGURATION
67
+Config file is located at: ~/.config/fetchx/config.toml
68
+.SH EXAMPLES
69
+.TP
70
+Basic usage:
71
+$ fetchx
72
+.TP
73
+With kitty image:
74
+$ fetchx --backend kitty
75
+.TP
76
+JSON output:
77
+$ fetchx --json
78
+.SH AUTHOR
79
+Written by Swadhin Biswas <[email protected]>
80
+.SH LICENSE
81
+MIT License
82
+.SH SEE ALSO
83
+neofetch(1), fastfetch(1)
0
84
▼debian/fetchx.bash-completion
+29-0
1
+# fetchx bash completion
2
+
3
+_fetchx() {
4
+ local cur prev opts
5
+ COMPREPLY=()
6
+ cur="${COMP_WORDS[COMP_CWORD]}"
7
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
8
+
9
+ opts="--help --version --json --logo-only --emoji --nerd-font --stdout --no-color
10
+ --bold --backend --source --ascii-distro --custom-image --gap --separator
11
+ --show-config --print-config --create-config --select-image --init-api-image
12
+ --daemon --tray-status --block-range-start --block-range-end --block-width"
13
+
14
+ case "${prev}" in
15
+ --backend|-b)
16
+ COMPREPLY=($(compgen -W "ascii kitty sixel chafa w3m iterm2 off" -- ${cur}))
17
+ return 0
18
+ ;;
19
+ --source|-s)
20
+ COMPREPLY=($(compgen -W "auto ascii wallpaper" -- ${cur}))
21
+ return 0
22
+ ;;
23
+ esac
24
+
25
+ COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
26
+ return 0
27
+}
28
+
29
+complete -F _fetchx fetchx
0
30
▼debian/fetchx.desktop
+9-0
1
+[Desktop Entry]
2
+Name=FetchX
3
+Comment=A blazing-fast system information tool
4
+Exec=fetchx
5
+Icon=utilities-terminal
6
+Terminal=true
7
+Type=Application
8
+Categories=Utility;System;Information;
9
+Keywords=neofetch;fetch;system;info;terminal;
0
10
▼debian/fetchx.zsh-completion
+41-0
1
+#fetchx zsh completion
2
+
3
+autoload -U compinit
4
+compinit
5
+
6
+typeset -A opt_args
7
+local context state line
8
+
9
+_fetchx() {
10
+ _arguments -C \
11
+ '--help[Show help message]' \
12
+ '--version[Show version information]' \
13
+ '--json[Print output as JSON]' \
14
+ '--logo-only[Only show the logo]' \
15
+ '--emoji[Use emoji mode]' \
16
+ '--nerd-font[Use Nerd Font icons]' \
17
+ '--stdout[Disable formatting for piping]' \
18
+ '--no-color[Disable colors]' \
19
+ '--bold[Enable/disable bold text]' \
20
+ '-b+[Image backend]:backend:(ascii kitty sixel chafa w3m iterm2 off)' \
21
+ '--backend+[Image backend]:backend:(ascii kitty sixel chafa w3m iterm2 off)' \
22
+ '-s+[Image source]:source:(auto ascii wallpaper)' \
23
+ '--source+[Image source]:source:(auto ascii wallpaper)' \
24
+ '--ascii-distro[Which distro ASCII art]:distro:' \
25
+ '-c+[Custom image path]:path:_files' \
26
+ '--custom-image+[Custom image path]:path:_files' \
27
+ '--gap[Gap between logo and info]:number:' \
28
+ '--separator[Separator between label and value]:sep:' \
29
+ '--show-config[Show config file path]' \
30
+ '--print-config[Print default config]' \
31
+ '--create-config[Create default config]' \
32
+ '--select-image[Interactive image picker]' \
33
+ '--init-api-image[Setup API image fetching]' \
34
+ '--daemon[Run as daemon]' \
35
+ '--tray-status[Compact status for tray]' \
36
+ '--block-range-start[Color block range start]:number:' \
37
+ '--block-range-end[Color block range end]:number:' \
38
+ '--block-width[Width of color blocks]:number:'
39
+}
40
+
41
+_fetchx "$@"
0
42
▼debian/rules
+14-0
1
+#!/usr/bin/make -f
2
+
3
+%:
4
+ dh $@ --with=systemd
5
+
6
+override_dh_auto_build:
7
+ cargo build --release --locked
8
+
9
+override_dh_auto_install:
10
+ install -Dm755 target/release/fetchx debian/fetchx/usr/bin/fetchx
11
+ install -Dm644 debian/fetchx.desktop debian/fetchx/usr/share/applications/fetchx.desktop
12
+ install -Dm644 debian/fetchx.bash-completion debian/fetchx/usr/share/bash-completion/completions/fetchx
13
+ install -Dm644 debian/fetchx.zsh-completion debian/fetchx/usr/share/zsh/vendor-completions/_fetchx
14
+ install -Dm644 debian/fetchx.1 debian/fetchx/usr/share/man/man1/fetchx.1
0
15
▼debian/source/format
+1-0
1
+3.0 (quilt)
0
2
▼debian/watch
+4-0
1
+version=4
2
+opts=filenamemangle=s/.+\/v?(\d+\.\d+\.\d+)\.tar\.gz/fetchx-$1.tar.gz/ \
3
+https://github.com/swadhinbiswas/fetchx/tags \
4
+.*/v?(\d+\.\d+\.\d+)\.tar\.gz
0
5