From f99e7dafae5bb29befcc5b5fca60487254f817b9 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Wed, 31 Dec 2025 09:07:38 -0400 Subject: [PATCH 01/64] Testing workflow --- .forgejo/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 56afe43..fa332ed 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -117,7 +117,7 @@ jobs: file "release-artifacts/$OUTPUT_NAME" || true - name: Upload artifacts - uses: https://code.forgejo.org/actions/upload-artifact@v6 + uses: https://data.forgejo.org/actions/upload-artifact@v4 with: name: binary-${{ matrix.target }} path: release-artifacts/ From 239f9529d52391e0cc4da0e2c7c30a16735760db Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Wed, 31 Dec 2025 12:24:21 -0400 Subject: [PATCH 02/64] Testing workflow --- .forgejo/workflows/release.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index fa332ed..0044c3a 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -117,7 +117,7 @@ jobs: file "release-artifacts/$OUTPUT_NAME" || true - name: Upload artifacts - uses: https://data.forgejo.org/actions/upload-artifact@v4 + uses: https://data.forgejo.org/forgejo/upload-artifact@v4 with: name: binary-${{ matrix.target }} path: release-artifacts/ From f3f88fcdbff43eff547c4a6680e87aaaaa20acfa Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Wed, 31 Dec 2025 13:11:24 -0400 Subject: [PATCH 03/64] Testing workflow --- .forgejo/workflows/release.yaml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 0044c3a..e8e3f32 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -12,15 +12,12 @@ jobs: include: - target: native cross: false + - target: aarch64-unknown-linux-gnu + cross: false + linker: aarch64-linux-gnu-gcc - target: x86_64-unknown-linux-gnu cross: true linker: x86_64-linux-gnu-gcc - - target: aarch64-unknown-linux-gnu - cross: true - linker: aarch64-linux-gnu-gcc - - target: armv7-unknown-linux-gnueabihf - cross: true - linker: arm-linux-gnueabihf-gcc - target: x86_64-pc-windows-gnu cross: true linker: x86_64-w64-mingw32-gcc From 8857104e64d8a04b2f5b4f1317a35e6fb5e35a98 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Wed, 31 Dec 2025 14:21:32 -0400 Subject: [PATCH 04/64] Testing workflow --- .forgejo/workflows/release.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index e8e3f32..a79393f 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -12,15 +12,15 @@ jobs: include: - target: native cross: false - - target: aarch64-unknown-linux-gnu - cross: false - linker: aarch64-linux-gnu-gcc + name: "ARM64 NATIVE" - target: x86_64-unknown-linux-gnu cross: true linker: x86_64-linux-gnu-gcc + name: "Linux x86_64" - target: x86_64-pc-windows-gnu cross: true linker: x86_64-w64-mingw32-gcc + name: "Windows x86_64" steps: - name: Checkout code @@ -130,7 +130,7 @@ jobs: uses: https://code.forgejo.org/actions/checkout@v4 - name: Download all artifacts - uses: https://code.forgejo.org/actions/download-artifact@v4 + uses: https://data.forgejo.org/forgejo/download-artifact@v4 with: path: all-artifacts/ From 390ec63af8fc6a7ba073e55d1c6a2d90b3e73f4e Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Wed, 31 Dec 2025 14:25:52 -0400 Subject: [PATCH 05/64] Testing workflow --- .forgejo/workflows/release.yaml | 153 +++++++++++++++++++++++++++++++- 1 file changed, 150 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index a79393f..1a19844 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -155,14 +155,161 @@ jobs: release-dir: release-artifacts title: "Release ${{ github.ref_name }}" tag: ${{ github.ref_name }} - release-notes: | + release-notesname: Multi-Platform Release Build +on: + push: + tags: + - "v*.*.*" +jobs: + build: + runs-on: docker + strategy: + fail-fast: false + matrix: + include: + - target: native + cross: false + container: "" + name: "ARM64 NATIVE" + + - target: x86_64-unknown-linux-gnu + cross: true + container: ghcr.io/forgejo-actions/rust-cross:x86_64-unknown-linux-gnu-2025 + name: "Linux x86_64" + + - target: x86_64-pc-windows-gnu + cross: true + container: ghcr.io/forgejo-actions/rust-cross:x86_64-pc-windows-gnu-2025 + name: "Windows x86_64" + + container: ${{ matrix.container }} + steps: + - name: Checkout code + uses: https://code.forgejo.org/actions/checkout@v4 + + - name: Setup Rust + uses: https://github.com/dtolnay/rust-toolchain@stable + with: + toolchain: stable + + - name: Add Rust target + if: matrix.target != 'native' && !matrix.container + run: rustup target add ${{ matrix.target }} + + - name: Cache Rust dependencies + uses: https://code.forgejo.org/actions/cache@v4 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-${{ matrix.target }}- + ${{ runner.os }}-cargo- + + - name: Configure cross-compilation + if: matrix.cross && matrix.target != 'native' && !matrix.container + run: | + mkdir -p .cargo + cat >> .cargo/config.toml << EOF + [target.${{ matrix.target }}] + linker = "${{ matrix.linker }}" + EOF + + - name: Build release + run: | + if [ "${{ matrix.target }}" = "native" ]; then + NATIVE_TARGET=$(rustc -vV | grep 'host:' | cut -d' ' -f2) + echo "Building for native target: $NATIVE_TARGET" + cargo build --release + TARGET_BINARY="target/release/uptime-kuma-dashboard" + OUTPUT_NAME="uptime-kuma-dashboard-$NATIVE_TARGET" + else + echo "Building for target: ${{ matrix.target }}" + # Os containers especializados já têm tudo configurado + cargo build --release --target ${{ matrix.target }} + + if [[ "${{ matrix.target }}" == *"windows"* ]]; then + TARGET_BINARY="target/${{ matrix.target }}/release/uptime-kuma-dashboard.exe" + OUTPUT_NAME="uptime-kuma-dashboard-${{ matrix.target }}.exe" + else + TARGET_BINARY="target/${{ matrix.target }}/release/uptime-kuma-dashboard" + OUTPUT_NAME="uptime-kuma-dashboard-${{ matrix.target }}" + fi + fi + + mkdir -p release-artifacts + + if [ ! -f "$TARGET_BINARY" ]; then + echo "Error: Binary not found at $TARGET_BINARY" + exit 1 + fi + + cp "$TARGET_BINARY" "release-artifacts/$OUTPUT_NAME" + + if [[ "${{ matrix.target }}" == *"linux"* ]] || [ "${{ matrix.target }}" = "native" ]; then + strip "release-artifacts/$OUTPUT_NAME" 2>/dev/null || echo "Strip failed, continuing..." + fi + + if [[ "${{ matrix.target }}" != *"windows"* ]]; then + chmod +x "release-artifacts/$OUTPUT_NAME" + fi + + ls -lh "release-artifacts/$OUTPUT_NAME" + file "release-artifacts/$OUTPUT_NAME" || true + + - name: Upload artifacts + uses: https://data.forgejo.org/forgejo/upload-artifact@v4 + with: + name: binary-${{ matrix.target }} + path: release-artifacts/ + retention-days: 1 + + create-release: + runs-on: docker + needs: build + permissions: + contents: write + steps: + - name: Checkout code + uses: https://code.forgejo.org/actions/checkout@v4 + + - name: Download all artifacts + uses: https://data.forgejo.org/forgejo/download-artifact@v4 + with: + path: all-artifacts/ + + - name: Prepare release artifacts + run: | + mkdir -p release-artifacts + find all-artifacts -type f -name "uptime-kuma-dashboard-*" -exec cp {} release-artifacts/ \; + ls -lh release-artifacts/ + + - name: Generate checksums + run: | + cd release-artifacts + sha256sum uptime-kuma-dashboard-* > SHA256SUMS.txt + cat SHA256SUMS.txt + + - name: Create Release + uses: https://code.forgejo.org/actions/forgejo-release@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + direction: upload + release-dir: release-artifacts + title: "Release ${{ github.ref_name }}" + tag: ${{ github.ref_name }} + release-notes:: | ## 🚀 Multi-Platform Release Compiled on runner **${{ env.RUNNER_ARCH }}** ### 📦 Available Binaries This release includes binaries for the following platforms: - **Linux x86_64** (Intel/AMD 64-bit) - - **Linux ARM64** (aarch64) - Raspberry Pi 4, Apple Silicon Linux, ARM servers - - **Linux ARMv7** (armhf) - Raspberry Pi 3 and earlier + - **Linux ARM64** (aarch64) - Raspberry Pi 4, ARM servers - **Windows x86_64** (64-bit) ### 🚀 How to use #### Linux/ARM: From 6bd9d5080c36b6186a9001abcf975dc5dbd2b1f3 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Wed, 31 Dec 2025 14:28:42 -0400 Subject: [PATCH 06/64] Testing workflow --- .forgejo/workflows/release.yaml | 157 -------------------------------- 1 file changed, 157 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 1a19844..d7a5f90 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -1,161 +1,4 @@ name: Multi-Platform Release Build -on: - push: - tags: - - "v*.*.*" -jobs: - build: - runs-on: docker - strategy: - fail-fast: false - matrix: - include: - - target: native - cross: false - name: "ARM64 NATIVE" - - target: x86_64-unknown-linux-gnu - cross: true - linker: x86_64-linux-gnu-gcc - name: "Linux x86_64" - - target: x86_64-pc-windows-gnu - cross: true - linker: x86_64-w64-mingw32-gcc - name: "Windows x86_64" - - steps: - - name: Checkout code - uses: https://code.forgejo.org/actions/checkout@v4 - - - name: Setup Rust - uses: https://github.com/dtolnay/rust-toolchain@stable - with: - toolchain: stable - - - name: Add Rust target - if: matrix.target != 'native' - run: rustup target add ${{ matrix.target }} - - - name: Install cross-compilation tools - if: matrix.cross - run: | - sudo apt-get update - sudo apt-get install -y \ - gcc-arm-linux-gnueabihf \ - gcc-aarch64-linux-gnu \ - gcc-x86-64-linux-gnu \ - g++-arm-linux-gnueabihf \ - g++-aarch64-linux-gnu \ - mingw-w64 \ - libc6-dev-armhf-cross \ - libc6-dev-arm64-cross - - - name: Cache Rust dependencies - uses: https://code.forgejo.org/actions/cache@v4 - with: - path: | - ~/.cargo/bin/ - ~/.cargo/registry/index/ - ~/.cargo/registry/cache/ - ~/.cargo/git/db/ - target/ - key: ${{ runner.os }}-cargo-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }} - restore-keys: | - ${{ runner.os }}-cargo-${{ matrix.target }}- - ${{ runner.os }}-cargo- - - - name: Configure cross-compilation - if: matrix.cross && matrix.target != 'native' - run: | - mkdir -p .cargo - cat >> .cargo/config.toml << EOF - [target.${{ matrix.target }}] - linker = "${{ matrix.linker }}" - EOF - - - name: Build release - run: | - if [ "${{ matrix.target }}" = "native" ]; then - NATIVE_TARGET=$(rustc -vV | grep 'host:' | cut -d' ' -f2) - echo "Building for native target: $NATIVE_TARGET" - cargo build --release - TARGET_BINARY="target/release/uptime-kuma-dashboard" - OUTPUT_NAME="uptime-kuma-dashboard-$NATIVE_TARGET" - else - echo "Building for target: ${{ matrix.target }}" - cargo build --release --target ${{ matrix.target }} - - if [[ "${{ matrix.target }}" == *"windows"* ]]; then - TARGET_BINARY="target/${{ matrix.target }}/release/uptime-kuma-dashboard.exe" - OUTPUT_NAME="uptime-kuma-dashboard-${{ matrix.target }}.exe" - else - TARGET_BINARY="target/${{ matrix.target }}/release/uptime-kuma-dashboard" - OUTPUT_NAME="uptime-kuma-dashboard-${{ matrix.target }}" - fi - fi - - mkdir -p release-artifacts - - if [ ! -f "$TARGET_BINARY" ]; then - echo "Error: Binary not found at $TARGET_BINARY" - exit 1 - fi - - cp "$TARGET_BINARY" "release-artifacts/$OUTPUT_NAME" - - if [[ "${{ matrix.target }}" == *"linux"* ]] || [ "${{ matrix.target }}" = "native" ]; then - strip "release-artifacts/$OUTPUT_NAME" 2>/dev/null || echo "Strip failed, continuing..." - fi - - if [[ "${{ matrix.target }}" != *"windows"* ]]; then - chmod +x "release-artifacts/$OUTPUT_NAME" - fi - - ls -lh "release-artifacts/$OUTPUT_NAME" - file "release-artifacts/$OUTPUT_NAME" || true - - - name: Upload artifacts - uses: https://data.forgejo.org/forgejo/upload-artifact@v4 - with: - name: binary-${{ matrix.target }} - path: release-artifacts/ - retention-days: 1 - - create-release: - runs-on: docker - needs: build - permissions: - contents: write - steps: - - name: Checkout code - uses: https://code.forgejo.org/actions/checkout@v4 - - - name: Download all artifacts - uses: https://data.forgejo.org/forgejo/download-artifact@v4 - with: - path: all-artifacts/ - - - name: Prepare release artifacts - run: | - mkdir -p release-artifacts - find all-artifacts -type f -name "uptime-kuma-dashboard-*" -exec cp {} release-artifacts/ \; - ls -lh release-artifacts/ - - - name: Generate checksums - run: | - cd release-artifacts - sha256sum uptime-kuma-dashboard-* > SHA256SUMS.txt - cat SHA256SUMS.txt - - - name: Create Release - uses: https://code.forgejo.org/actions/forgejo-release@v2 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - direction: upload - release-dir: release-artifacts - title: "Release ${{ github.ref_name }}" - tag: ${{ github.ref_name }} - release-notesname: Multi-Platform Release Build on: push: tags: From 041e5622b62bb4abe8240986452fe41262e5adc1 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 1 Jan 2026 07:44:31 -0400 Subject: [PATCH 07/64] Testing workflow --- .forgejo/workflows/release.yaml | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index d7a5f90..4a18fa6 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -12,20 +12,19 @@ jobs: include: - target: native cross: false - container: "" - name: "ARM64 NATIVE" + platform: linux/arm64 - target: x86_64-unknown-linux-gnu cross: true - container: ghcr.io/forgejo-actions/rust-cross:x86_64-unknown-linux-gnu-2025 - name: "Linux x86_64" + platform: linux/amd64 - target: x86_64-pc-windows-gnu cross: true - container: ghcr.io/forgejo-actions/rust-cross:x86_64-pc-windows-gnu-2025 - name: "Windows x86_64" + platform: linux/amd64 - container: ${{ matrix.container }} + container: + image: rust:alpine + options: --platform ${{ matrix.platform }} steps: - name: Checkout code uses: https://code.forgejo.org/actions/checkout@v4 From 1de395dfc0a088097d1990b5c67531e73970ef4d Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 1 Jan 2026 08:34:48 -0400 Subject: [PATCH 08/64] Testing workflow --- .forgejo/workflows/release.yaml | 89 ++++++++++++++++----------------- 1 file changed, 43 insertions(+), 46 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 4a18fa6..a1f7494 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -52,56 +52,53 @@ jobs: ${{ runner.os }}-cargo-${{ matrix.target }}- ${{ runner.os }}-cargo- - - name: Configure cross-compilation - if: matrix.cross && matrix.target != 'native' && !matrix.container + - name: Native Build Release + if: matrix.target == 'native' run: | - mkdir -p .cargo - cat >> .cargo/config.toml << EOF - [target.${{ matrix.target }}] - linker = "${{ matrix.linker }}" - EOF - - - name: Build release - run: | - if [ "${{ matrix.target }}" = "native" ]; then - NATIVE_TARGET=$(rustc -vV | grep 'host:' | cut -d' ' -f2) - echo "Building for native target: $NATIVE_TARGET" - cargo build --release - TARGET_BINARY="target/release/uptime-kuma-dashboard" - OUTPUT_NAME="uptime-kuma-dashboard-$NATIVE_TARGET" - else - echo "Building for target: ${{ matrix.target }}" - # Os containers especializados já têm tudo configurado - cargo build --release --target ${{ matrix.target }} - - if [[ "${{ matrix.target }}" == *"windows"* ]]; then - TARGET_BINARY="target/${{ matrix.target }}/release/uptime-kuma-dashboard.exe" - OUTPUT_NAME="uptime-kuma-dashboard-${{ matrix.target }}.exe" - else - TARGET_BINARY="target/${{ matrix.target }}/release/uptime-kuma-dashboard" - OUTPUT_NAME="uptime-kuma-dashboard-${{ matrix.target }}" - fi - fi - + NATIVE_TARGET=$(rustc -vV | grep 'host:' | cut -d' ' -f2) + echo "Building for native target: $NATIVE_TARGET" + cargo build --release + TARGET_BINARY="target/release/uptime-kuma-dashboard" + OUTPUT_NAME="uptime-kuma-dashboard-$NATIVE_TARGET" mkdir -p release-artifacts - - if [ ! -f "$TARGET_BINARY" ]; then - echo "Error: Binary not found at $TARGET_BINARY" - exit 1 - fi - cp "$TARGET_BINARY" "release-artifacts/$OUTPUT_NAME" - - if [[ "${{ matrix.target }}" == *"linux"* ]] || [ "${{ matrix.target }}" = "native" ]; then - strip "release-artifacts/$OUTPUT_NAME" 2>/dev/null || echo "Strip failed, continuing..." - fi - - if [[ "${{ matrix.target }}" != *"windows"* ]]; then - chmod +x "release-artifacts/$OUTPUT_NAME" - fi - + strip "release-artifacts/$OUTPUT_NAME" 2>/dev/null || true + chmod +x "release-artifacts/$OUTPUT_NAME" ls -lh "release-artifacts/$OUTPUT_NAME" - file "release-artifacts/$OUTPUT_NAME" || true + + - name: Cross-Build Release (Linux x86_64) + if: matrix.target == 'x86_64-unknown-linux-gnu' + uses: docker://rust:alpine + with: + args: > + sh -c " + apk add --no-cache build-base musl-dev gcc g++ && + rustup target add x86_64-unknown-linux-gnu && + cargo build --release --target x86_64-unknown-linux-gnu && + mkdir -p release-artifacts && + cp target/x86_64-unknown-linux-gnu/release/uptime-kuma-dashboard release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && + strip release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && + chmod +x release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && + ls -lh release-artifacts/" + env: + CARGO_TARGET_DIR: target + options: --platform linux/amd64 + + - name: Cross-Build Release (Windows x86_64) + if: matrix.target == 'x86_64-pc-windows-gnu' + uses: docker://rust:alpine + with: + args: > + sh -c " + apk add --no-cache build-base mingw-w64-gcc mingw-w64-headers mingw-w64-crt mingw-w64-winpthreads && + rustup target add x86_64-pc-windows-gnu && + cargo build --release --target x86_64-pc-windows-gnu && + mkdir -p release-artifacts && + cp target/x86_64-pc-windows-gnu/release/uptime-kuma-dashboard.exe release-artifacts/uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe && + ls -lh release-artifacts/" + env: + CARGO_TARGET_DIR: target + options: --platform linux/amd64 - name: Upload artifacts uses: https://data.forgejo.org/forgejo/upload-artifact@v4 From 1de1cdd9b94fdc9d56bbf1b5d4386e7c190ed759 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 1 Jan 2026 08:36:34 -0400 Subject: [PATCH 09/64] Testing workflow --- .forgejo/workflows/release.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index a1f7494..dd8f443 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -22,9 +22,6 @@ jobs: cross: true platform: linux/amd64 - container: - image: rust:alpine - options: --platform ${{ matrix.platform }} steps: - name: Checkout code uses: https://code.forgejo.org/actions/checkout@v4 From a59a7ab7ceb06e97d2a79c785df27d8cde7a03fc Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 1 Jan 2026 15:03:58 -0400 Subject: [PATCH 10/64] Testing workflow --- .forgejo/workflows/release.yaml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index dd8f443..e68f7a8 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -17,10 +17,12 @@ jobs: - target: x86_64-unknown-linux-gnu cross: true platform: linux/amd64 + deps: "build-essential libssl-dev pkg-config" - target: x86_64-pc-windows-gnu cross: true platform: linux/amd64 + deps: "build-essential mingw-w64" steps: - name: Checkout code @@ -35,6 +37,11 @@ jobs: if: matrix.target != 'native' && !matrix.container run: rustup target add ${{ matrix.target }} + - name: Install build dependencies + if: matrix.cross && matrix.deps + run: | + apk add --no-cache ${{ matrix.deps }} + - name: Cache Rust dependencies uses: https://code.forgejo.org/actions/cache@v4 with: From 99f143fcc2eabcb5bb1299a7a5ef4ad3305fa41a Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 1 Jan 2026 15:25:40 -0400 Subject: [PATCH 11/64] Testing workflow --- .forgejo/workflows/release.yaml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index e68f7a8..de9e8d3 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -17,12 +17,10 @@ jobs: - target: x86_64-unknown-linux-gnu cross: true platform: linux/amd64 - deps: "build-essential libssl-dev pkg-config" - target: x86_64-pc-windows-gnu cross: true platform: linux/amd64 - deps: "build-essential mingw-w64" steps: - name: Checkout code @@ -37,11 +35,6 @@ jobs: if: matrix.target != 'native' && !matrix.container run: rustup target add ${{ matrix.target }} - - name: Install build dependencies - if: matrix.cross && matrix.deps - run: | - apk add --no-cache ${{ matrix.deps }} - - name: Cache Rust dependencies uses: https://code.forgejo.org/actions/cache@v4 with: @@ -76,7 +69,7 @@ jobs: with: args: > sh -c " - apk add --no-cache build-base musl-dev gcc g++ && + apk add --no-cache build-base musl-dev gcc g++ openssl-dev pkg-config && rustup target add x86_64-unknown-linux-gnu && cargo build --release --target x86_64-unknown-linux-gnu && mkdir -p release-artifacts && From 415032ecd1501503f84650cea7111c7ad19da814 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 1 Jan 2026 17:47:56 -0400 Subject: [PATCH 12/64] Testing workflow --- .forgejo/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index de9e8d3..1a1fa59 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -69,7 +69,7 @@ jobs: with: args: > sh -c " - apk add --no-cache build-base musl-dev gcc g++ openssl-dev pkg-config && + apk add --no-cache build-base musl-dev gcc g++ openssl-dev && rustup target add x86_64-unknown-linux-gnu && cargo build --release --target x86_64-unknown-linux-gnu && mkdir -p release-artifacts && @@ -87,7 +87,7 @@ jobs: with: args: > sh -c " - apk add --no-cache build-base mingw-w64-gcc mingw-w64-headers mingw-w64-crt mingw-w64-winpthreads && + apk add --no-cache build-base mingw-w64 && rustup target add x86_64-pc-windows-gnu && cargo build --release --target x86_64-pc-windows-gnu && mkdir -p release-artifacts && From ca1442851c3ee498832505c3b701b87beda0e188 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 1 Jan 2026 19:17:53 -0400 Subject: [PATCH 13/64] Testing workflow --- .forgejo/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 1a1fa59..1850902 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -69,7 +69,7 @@ jobs: with: args: > sh -c " - apk add --no-cache build-base musl-dev gcc g++ openssl-dev && + apk add --no-cache build-base openssl-dev pkgconf && rustup target add x86_64-unknown-linux-gnu && cargo build --release --target x86_64-unknown-linux-gnu && mkdir -p release-artifacts && @@ -87,7 +87,7 @@ jobs: with: args: > sh -c " - apk add --no-cache build-base mingw-w64 && + apk add --no-cache build-base mingw-w64-gcc mingw-w64-headers mingw-w64-crt mingw-w64-winpthreads rustup target add x86_64-pc-windows-gnu && cargo build --release --target x86_64-pc-windows-gnu && mkdir -p release-artifacts && From e5938b9014b924a4afa133238cda6f4fb3b75f77 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Fri, 2 Jan 2026 06:47:40 -0400 Subject: [PATCH 14/64] Testing workflow --- .forgejo/workflows/release.yaml | 47 +++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 1850902..ded5e24 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -17,10 +17,19 @@ jobs: - target: x86_64-unknown-linux-gnu cross: true platform: linux/amd64 + deps: "build-essential libssl-dev pkg-config" + env: + PKG_CONFIG_ALLOW_CROSS: "1" + OPENSSL_DIR: /usr + PKG_CONFIG_PATH: "/usr/lib/pkgconfig:/usr/share/pkgconfig" - target: x86_64-pc-windows-gnu cross: true platform: linux/amd64 + deps: "build-essential gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64" + env: + CC_x86_64_pc_windows_gnu: x86_64-w64-mingw32-gcc + CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER: x86_64-w64-mingw32-gcc steps: - name: Checkout code @@ -63,39 +72,37 @@ jobs: chmod +x "release-artifacts/$OUTPUT_NAME" ls -lh "release-artifacts/$OUTPUT_NAME" - - name: Cross-Build Release (Linux x86_64) + - name: Cross-Build Linux x86_64 Release if: matrix.target == 'x86_64-unknown-linux-gnu' - uses: docker://rust:alpine + uses: docker://rust:slim with: args: > sh -c " - apk add --no-cache build-base openssl-dev pkgconf && + apt-get update && apt-get install -y ${{ matrix.deps }} && rustup target add x86_64-unknown-linux-gnu && cargo build --release --target x86_64-unknown-linux-gnu && - mkdir -p release-artifacts && - cp target/x86_64-unknown-linux-gnu/release/uptime-kuma-dashboard release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && - strip release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && - chmod +x release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && - ls -lh release-artifacts/" - env: - CARGO_TARGET_DIR: target - options: --platform linux/amd64 + mkdir -p /github/workspace/release-artifacts && + cp target/x86_64-unknown-linux-gnu/release/uptime-kuma-dashboard /github/workspace/release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && + strip /github/workspace/release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && + chmod +x /github/workspace/release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && + ls -lh /github/workspace/release-artifacts/" + env: ${{ matrix.env }} + options: --platform ${{ matrix.platform }} - - name: Cross-Build Release (Windows x86_64) + - name: Cross-Build Windows x86_64 Release if: matrix.target == 'x86_64-pc-windows-gnu' - uses: docker://rust:alpine + uses: docker://rust:slim with: args: > sh -c " - apk add --no-cache build-base mingw-w64-gcc mingw-w64-headers mingw-w64-crt mingw-w64-winpthreads + apt-get update && apt-get install -y ${{ matrix.deps }} && rustup target add x86_64-pc-windows-gnu && cargo build --release --target x86_64-pc-windows-gnu && - mkdir -p release-artifacts && - cp target/x86_64-pc-windows-gnu/release/uptime-kuma-dashboard.exe release-artifacts/uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe && - ls -lh release-artifacts/" - env: - CARGO_TARGET_DIR: target - options: --platform linux/amd64 + mkdir -p /github/workspace/release-artifacts && + cp target/x86_64-pc-windows-gnu/release/uptime-kuma-dashboard.exe /github/workspace/release-artifacts/uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe && + ls -lh /github/workspace/release-artifacts/" + env: ${{ matrix.env }} + options: --platform ${{ matrix.platform }} - name: Upload artifacts uses: https://data.forgejo.org/forgejo/upload-artifact@v4 From 845c49f664e27fe7f5d570b649378a46b82fa75c Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Fri, 2 Jan 2026 07:16:37 -0400 Subject: [PATCH 15/64] Testing workflow --- .forgejo/workflows/release.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index ded5e24..4034e29 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -78,6 +78,7 @@ jobs: with: args: > sh -c " + echo 'OPENSSL_DIR:' $OPENSSL_DIR apt-get update && apt-get install -y ${{ matrix.deps }} && rustup target add x86_64-unknown-linux-gnu && cargo build --release --target x86_64-unknown-linux-gnu && From a31c7a4a3ec0c3ab7a7d1afa373b470b2837d1a5 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Fri, 2 Jan 2026 09:04:30 -0400 Subject: [PATCH 16/64] Testing workflow --- .forgejo/workflows/release.yaml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 4034e29..21bf313 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -78,15 +78,15 @@ jobs: with: args: > sh -c " - echo 'OPENSSL_DIR:' $OPENSSL_DIR + echo 'OPENSSL_DIR:' $OPENSSL_DIR && apt-get update && apt-get install -y ${{ matrix.deps }} && rustup target add x86_64-unknown-linux-gnu && cargo build --release --target x86_64-unknown-linux-gnu && - mkdir -p /github/workspace/release-artifacts && - cp target/x86_64-unknown-linux-gnu/release/uptime-kuma-dashboard /github/workspace/release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && - strip /github/workspace/release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && - chmod +x /github/workspace/release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && - ls -lh /github/workspace/release-artifacts/" + mkdir -p release-artifacts && + cp target/x86_64-unknown-linux-gnu/release/uptime-kuma-dashboard release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && + strip release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && + chmod +x release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && + ls -lh release-artifacts/" env: ${{ matrix.env }} options: --platform ${{ matrix.platform }} @@ -99,9 +99,9 @@ jobs: apt-get update && apt-get install -y ${{ matrix.deps }} && rustup target add x86_64-pc-windows-gnu && cargo build --release --target x86_64-pc-windows-gnu && - mkdir -p /github/workspace/release-artifacts && - cp target/x86_64-pc-windows-gnu/release/uptime-kuma-dashboard.exe /github/workspace/release-artifacts/uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe && - ls -lh /github/workspace/release-artifacts/" + mkdir -p release-artifacts && + cp target/x86_64-pc-windows-gnu/release/uptime-kuma-dashboard.exe release-artifacts/uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe && + ls -lh release-artifacts/" env: ${{ matrix.env }} options: --platform ${{ matrix.platform }} @@ -141,12 +141,12 @@ jobs: - name: Create Release uses: https://code.forgejo.org/actions/forgejo-release@v2 env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} with: direction: upload release-dir: release-artifacts - title: "Release ${{ github.ref_name }}" - tag: ${{ github.ref_name }} + title: "Release ${{ forgejo.ref_name }}" + tag: ${{ forgejo.ref_name }} release-notes:: | ## 🚀 Multi-Platform Release Compiled on runner **${{ env.RUNNER_ARCH }}** From 7bb7a5a6b1aa29dcdefab695083f1e45043a7c2a Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Fri, 2 Jan 2026 10:12:51 -0400 Subject: [PATCH 17/64] Testing workflow --- .forgejo/workflows/release.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 21bf313..8a7ce3b 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -17,11 +17,13 @@ jobs: - target: x86_64-unknown-linux-gnu cross: true platform: linux/amd64 - deps: "build-essential libssl-dev pkg-config" + deps: "build-essential libssl-dev pkg-config gcc-x86_64-linux-gnu" env: PKG_CONFIG_ALLOW_CROSS: "1" - OPENSSL_DIR: /usr - PKG_CONFIG_PATH: "/usr/lib/pkgconfig:/usr/share/pkgconfig" + OPENSSL_STATIC: "1" + OPENSSL_LIB_DIR: "/usr/lib/x86_64-linux-gnu" + OPENSSL_INCLUDE_DIR: "/usr/include/openssl" + PKG_CONFIG_ALL_STATIC: "1" - target: x86_64-pc-windows-gnu cross: true From 3c95626cf91a668ceec9216b8446c50d2f907c15 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Fri, 2 Jan 2026 11:45:30 -0400 Subject: [PATCH 18/64] Testing workflow --- .forgejo/workflows/release.yaml | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 8a7ce3b..7b24b59 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -17,13 +17,6 @@ jobs: - target: x86_64-unknown-linux-gnu cross: true platform: linux/amd64 - deps: "build-essential libssl-dev pkg-config gcc-x86_64-linux-gnu" - env: - PKG_CONFIG_ALLOW_CROSS: "1" - OPENSSL_STATIC: "1" - OPENSSL_LIB_DIR: "/usr/lib/x86_64-linux-gnu" - OPENSSL_INCLUDE_DIR: "/usr/include/openssl" - PKG_CONFIG_ALL_STATIC: "1" - target: x86_64-pc-windows-gnu cross: true @@ -76,20 +69,20 @@ jobs: - name: Cross-Build Linux x86_64 Release if: matrix.target == 'x86_64-unknown-linux-gnu' - uses: docker://rust:slim + uses: docker://ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main with: args: > sh -c " - echo 'OPENSSL_DIR:' $OPENSSL_DIR && - apt-get update && apt-get install -y ${{ matrix.deps }} && - rustup target add x86_64-unknown-linux-gnu && + export OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu + export OPENSSL_INCLUDE_DIR=/usr/include/openssl + export PKG_CONFIG_ALLOW_CROSS=1 + export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig + cargo build --release --target x86_64-unknown-linux-gnu && mkdir -p release-artifacts && cp target/x86_64-unknown-linux-gnu/release/uptime-kuma-dashboard release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && strip release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && - chmod +x release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && - ls -lh release-artifacts/" - env: ${{ matrix.env }} + chmod +x release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu" options: --platform ${{ matrix.platform }} - name: Cross-Build Windows x86_64 Release From 6e94081db27c793da7222981e25721206d377808 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Fri, 2 Jan 2026 14:31:05 -0400 Subject: [PATCH 19/64] Testing workflow --- .forgejo/workflows/release.yaml | 9 +++------ .vscode/launch.json | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 .vscode/launch.json diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 7b24b59..dbd0374 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -69,15 +69,12 @@ jobs: - name: Cross-Build Linux x86_64 Release if: matrix.target == 'x86_64-unknown-linux-gnu' - uses: docker://ghcr.io/cross-rs/x86_64-unknown-linux-gnu:main + uses: docker://rust:slim with: args: > sh -c " - export OPENSSL_LIB_DIR=/usr/lib/x86_64-linux-gnu - export OPENSSL_INCLUDE_DIR=/usr/include/openssl - export PKG_CONFIG_ALLOW_CROSS=1 - export PKG_CONFIG_PATH=/usr/lib/x86_64-linux-gnu/pkgconfig - + apt-get update && apt-get install -y build-essential libssl-dev pkg-config gcc-x86-64-linux-gnu && + rustup target add x86_64-unknown-linux-gnu && cargo build --release --target x86_64-unknown-linux-gnu && mkdir -p release-artifacts && cp target/x86_64-unknown-linux-gnu/release/uptime-kuma-dashboard release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..22d5b4c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,31 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Debug executable 'uptime-kuma-dashboard'", + "type": "lldb", + "request": "launch", + "cargo": { + "args": [ + "run", + "-- --base-url=http://192.168.69.10:3001/ --slug formgen", + ] + }, + "args": [] + }, + { + "name": "Debug unit tests in executable 'uptime-kuma-dashboard'", + "type": "lldb", + "request": "launch", + "cargo": { + "args": [ + "test", + "--bin=uptime-kuma-dashboard" + ] + } + } + ] +} From 5a7719834441776e2727f29ea2b94bfc6dac1c13 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Sat, 3 Jan 2026 08:45:13 -0400 Subject: [PATCH 20/64] Fix translation error --- .vscode/launch.json | 7 +++++-- src/i18n/translate.rs | 12 ++++-------- src/locales/en-US/main.ftl | 14 +++++++------- src/locales/pt-BR/main.ftl | 12 ++++++------ 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 22d5b4c..aa677e3 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -11,10 +11,13 @@ "cargo": { "args": [ "run", - "-- --base-url=http://192.168.69.10:3001/ --slug formgen", + "--bin=uptime-kuma-dashboard" ] }, - "args": [] + "args": [ + "--base-url=http://192.168.69.10:3001/", + "--slug=formgen", + ] }, { "name": "Debug unit tests in executable 'uptime-kuma-dashboard'", diff --git a/src/i18n/translate.rs b/src/i18n/translate.rs index 1207704..660bebd 100644 --- a/src/i18n/translate.rs +++ b/src/i18n/translate.rs @@ -48,12 +48,8 @@ pub fn t(key: &str) -> String { pub fn t_with_args(key: &str, args: &HashMap<&'static str, String>) -> String { let mut map = HashMap::new(); - let args_map: &HashMap, FluentValue<'_>>; - args_map = { - for (key, value) in args { - map.insert(Cow::Borrowed(*key), FluentValue::from(value.clone())); - } - &map - }; - LOCALES.lookup_with_args(&get_system_locale(), key, args_map) + for (key, value) in args { + map.insert(Cow::Borrowed(*key), FluentValue::from(value)); + } + LOCALES.lookup_with_args(&get_system_locale(), key, &map) } diff --git a/src/locales/en-US/main.ftl b/src/locales/en-US/main.ftl index f01d87d..35172a8 100644 --- a/src/locales/en-US/main.ftl +++ b/src/locales/en-US/main.ftl @@ -6,9 +6,9 @@ Response = Response response = response invalid-json-status-page = ❌ Error parssing status page JSON invalid-json-heartbeat = ❌ Error parssing heartbeat JSON -invalid-uptime-key-format = Invalid format for uptime key. Expected format "monitorID_period". Received key: {key} -invalid-monitor-id = Invalid monitor ID: {id} -invalid-period-hours = Invalid period in hours: {hours} +invalid-uptime-key-format = Invalid format for uptime key. Expected format "monitorID_period". Received key: {$key} +invalid-monitor-id = Invalid monitor ID: {$id} +invalid-period-hours = Invalid period in hours: {$hours} loading = Loading... monitors = Monitors unknown = Unknown @@ -18,11 +18,11 @@ status = Status error = Error dashboard-header = Status Dashboard never = Never -auto-update-failed = Automatic update failed: {error} -update-fail = Failed to update data: {error} +auto-update-failed = Automatic update failed: {$error} +update-fail = Failed to update data: {$error} now = Now uptime = Uptime history = History -auto-update-enabled = Auto-update enabled ({interval} min) -update-failed = Update failed: {error} +auto-update-enabled = Auto-update enabled ({$interval} min) +update-failed = Update failed: {$error} key-to-exit = Press 'q' to exit diff --git a/src/locales/pt-BR/main.ftl b/src/locales/pt-BR/main.ftl index df72828..31a5c98 100644 --- a/src/locales/pt-BR/main.ftl +++ b/src/locales/pt-BR/main.ftl @@ -5,10 +5,10 @@ missing_url = ❌ URL não fornecida. Use --url ou a variável de ambiente UPTIM Response = Resposta response = resposta invalid-json-status-page = ❌ Falha ao parsear JSON do status page -invalid-json-heartbeat = ❌ Falha ao parsear JSON do heartbeat -invalid-uptime-key-format = Formato inválido na chave de uptime. Chave esperada no formato "monitorID_periodo". Chave recebida: {key} -invalid-monitor-id = ID de monitor inválido: {id} -invalid-period-hours = Período em horas inválido: {hours} +invalid-json-heartbeat = Falha ao parsear JSON do heartbeat +invalid-uptime-key-format = Formato inválido na chave de uptime. Chave esperada no formato "monitorID_periodo". Chave recebida: {$key} +invalid-monitor-id = ID de monitor inválido: {$id} +invalid-period-hours = Período em horas inválido: {$hours} loading = Carregando... monitors = Monitors monitor = Monitor @@ -23,6 +23,6 @@ auto-update-failed = Falha na atualização automática update-fail = Falha ao atualizar dados now = Agora history = Historico -auto-update-enabled = Auto-atualização ativada ({interval} min) -update-failed = Falha na atualização: {error} +auto-update-enabled = Auto-atualização ativada ({$interval} min) +update-failed = Falha na atualização: {$error} key-to-exit = Pressione 'q' para sair From d3ff4d3916a6cc2e587ce7ece019108bf2f99955 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Sat, 3 Jan 2026 13:50:01 -0400 Subject: [PATCH 21/64] Update Cargo.toml --- Cargo.lock | 544 +++++++++++++++++++++++++++++++++++++---------------- Cargo.toml | 6 +- 2 files changed, 390 insertions(+), 160 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 79170dd..fa911e1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -103,6 +103,28 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +[[package]] +name = "aws-lc-rs" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88aab2464f1f25453baa7a07c84c5b7684e274054ba06817f382357f77a288" +dependencies = [ + "aws-lc-sys", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45afffdee1e7c9126814751f88dddc747f41d91da16c9551a0f1e8a11e788a1" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + [[package]] name = "base64" version = "0.22.1" @@ -189,9 +211,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f50d563227a1c37cc0a263f64eca3334388c01c5e4c4861a9def205c614383c" dependencies = [ "find-msvc-tools", + "jobserver", + "libc", "shlex", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + [[package]] name = "cfg-if" version = "1.0.4" @@ -219,9 +249,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.53" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8" +checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" dependencies = [ "clap_builder", "clap_derive", @@ -229,9 +259,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.53" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00" +checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" dependencies = [ "anstream", "anstyle", @@ -257,12 +287,31 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d" +[[package]] +name = "cmake" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +dependencies = [ + "cc", +] + [[package]] name = "colorchoice" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + [[package]] name = "compact_str" version = "0.9.0" @@ -296,6 +345,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -485,6 +544,12 @@ dependencies = [ "litrs", ] +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + [[package]] name = "either" version = "1.15.0" @@ -535,12 +600,6 @@ dependencies = [ "regex", ] -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - [[package]] name = "filedescriptor" version = "0.8.3" @@ -658,21 +717,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.2" @@ -682,6 +726,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "futures-channel" version = "0.3.31" @@ -749,8 +799,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", ] [[package]] @@ -760,9 +812,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", "wasip2", + "wasm-bindgen", ] [[package]] @@ -897,22 +951,6 @@ dependencies = [ "tower-service", ] -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - [[package]] name = "hyper-util" version = "0.1.19" @@ -1184,6 +1222,38 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + [[package]] name = "js-sys" version = "0.3.83" @@ -1274,6 +1344,12 @@ dependencies = [ "hashbrown", ] +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + [[package]] name = "mac_address" version = "1.1.8" @@ -1329,23 +1405,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - [[package]] name = "nix" version = "0.29.0" @@ -1416,49 +1475,11 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" -[[package]] -name = "openssl" -version = "0.10.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" -dependencies = [ - "bitflags 2.10.0", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - [[package]] name = "openssl-probe" -version = "0.1.6" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] +checksum = "9f50d9b3dabb09ecd771ad0aa242ca6894994c130308ca3d7684634df8037391" [[package]] name = "ordered-float" @@ -1568,7 +1589,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared", - "rand", + "rand 0.8.5", ] [[package]] @@ -1605,12 +1626,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - [[package]] name = "portable-atomic" version = "1.13.0" @@ -1632,6 +1647,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + [[package]] name = "proc-macro-hack" version = "0.5.20+deprecated" @@ -1647,6 +1671,62 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror 2.0.17", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "aws-lc-rs", + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.17", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + [[package]] name = "quote" version = "1.0.42" @@ -1668,7 +1748,27 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", ] [[package]] @@ -1677,6 +1777,15 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + [[package]] name = "ratatui" version = "0.30.0" @@ -1822,9 +1931,9 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.12.28" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" +checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62" dependencies = [ "base64", "bytes", @@ -1838,21 +1947,21 @@ dependencies = [ "http-body-util", "hyper", "hyper-rustls", - "hyper-tls", "hyper-util", "js-sys", "log", "mime", - "native-tls", "percent-encoding", "pin-project-lite", + "quinn", + "rustls", "rustls-pki-types", + "rustls-platform-verifier", "serde", "serde_json", - "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-native-tls", + "tokio-rustls", "tower", "tower-http", "tower-service", @@ -1910,6 +2019,7 @@ version = "0.23.35" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ + "aws-lc-rs", "once_cell", "rustls-pki-types", "rustls-webpki", @@ -1917,21 +2027,62 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rustls-native-certs" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + [[package]] name = "rustls-pki-types" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" dependencies = [ + "web-time", "zeroize", ] +[[package]] +name = "rustls-platform-verifier" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +dependencies = [ + "core-foundation 0.10.1", + "core-foundation-sys", + "jni", + "log", + "once_cell", + "rustls", + "rustls-native-certs", + "rustls-platform-verifier-android", + "rustls-webpki", + "security-framework", + "security-framework-sys", + "webpki-root-certs", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls-platform-verifier-android" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" + [[package]] name = "rustls-webpki" version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ + "aws-lc-rs", "ring", "rustls-pki-types", "untrusted", @@ -1975,12 +2126,12 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.11.1" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ "bitflags 2.10.0", - "core-foundation", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -2051,18 +2202,6 @@ dependencies = [ "zmij", ] -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - [[package]] name = "sha2" version = "0.10.9" @@ -2250,7 +2389,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -2264,19 +2403,6 @@ dependencies = [ "libc", ] -[[package]] -name = "tempfile" -version = "3.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" -dependencies = [ - "fastrand", - "getrandom 0.3.4", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - [[package]] name = "terminfo" version = "0.9.0" @@ -2412,6 +2538,21 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" version = "1.48.0" @@ -2426,16 +2567,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - [[package]] name = "tokio-rustls" version = "0.26.4" @@ -2684,12 +2815,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.5" @@ -2807,6 +2932,25 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-root-certs" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36a29fc0408b113f68cf32637857ab740edfafdf460c326cd2afaa2d84cc05dc" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "wezterm-bidi" version = "0.2.3" @@ -2980,6 +3124,15 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -3007,6 +3160,21 @@ dependencies = [ "windows-link", ] +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -3040,6 +3208,12 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -3052,6 +3226,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -3064,6 +3244,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -3088,6 +3274,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -3100,6 +3292,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -3112,6 +3310,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -3124,6 +3328,12 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -3171,6 +3381,26 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zerocopy" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "zerofrom" version = "0.1.6" diff --git a/Cargo.toml b/Cargo.toml index 0765f37..b5777f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,8 +4,8 @@ version = "0.1.0" edition = "2024" [dependencies] -clap = { version = "4.5", features = ["derive", "env"] } -reqwest = { version = "0.12.28", features = ["blocking", "json"] } +clap = { version = "4.5.54", features = ["derive", "env"] } +reqwest = { version = "0.13.1", features = ["blocking", "json"] } anyhow = "1.0" fluent-templates = "0.13.2" unic-langid = "0.9.6" @@ -33,7 +33,7 @@ lto = true codegen-units = 1 strip = true panic = "abort" -debug = false +debug = false [profile.release-min] inherits = "release" From 2a6b23390962d18a406d22961ad30734dccb7529 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Sat, 3 Jan 2026 14:15:35 -0400 Subject: [PATCH 22/64] Testing workflow --- Cargo.lock | 109 +---------------------------------------------------- Cargo.toml | 6 ++- 2 files changed, 7 insertions(+), 108 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fa911e1..3d79d14 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -335,16 +335,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "core-foundation" version = "0.10.1" @@ -556,15 +546,6 @@ version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -832,25 +813,6 @@ dependencies = [ "regex-syntax", ] -[[package]] -name = "h2" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "hashbrown" version = "0.16.1" @@ -923,7 +885,6 @@ dependencies = [ "bytes", "futures-channel", "futures-core", - "h2", "http", "http-body", "httparse", @@ -970,11 +931,9 @@ dependencies = [ "percent-encoding", "pin-project-lite", "socket2", - "system-configuration", "tokio", "tower-service", "tracing", - "windows-registry", ] [[package]] @@ -1125,16 +1084,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "indexmap" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" -dependencies = [ - "equivalent", - "hashbrown", -] - [[package]] name = "indoc" version = "2.0.7" @@ -1381,12 +1330,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - [[package]] name = "minimal-lexical" version = "0.2.1" @@ -1937,11 +1880,9 @@ checksum = "04e9018c9d814e5f30cc16a0f03271aeab3571e609612d9fe78c1aa8d11c2f62" dependencies = [ "base64", "bytes", - "encoding_rs", "futures-channel", "futures-core", "futures-util", - "h2", "http", "http-body", "http-body-util", @@ -1950,7 +1891,6 @@ dependencies = [ "hyper-util", "js-sys", "log", - "mime", "percent-encoding", "pin-project-lite", "quinn", @@ -2055,7 +1995,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" dependencies = [ - "core-foundation 0.10.1", + "core-foundation", "core-foundation-sys", "jni", "log", @@ -2131,7 +2071,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ "bitflags 2.10.0", - "core-foundation 0.10.1", + "core-foundation", "core-foundation-sys", "libc", "security-framework-sys", @@ -2382,27 +2322,6 @@ dependencies = [ "libc", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "terminfo" version = "0.9.0" @@ -2577,19 +2496,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-util" -version = "0.7.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - [[package]] name = "tower" version = "0.5.2" @@ -3095,17 +3001,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link", - "windows-result", - "windows-strings", -] - [[package]] name = "windows-result" version = "0.4.1" diff --git a/Cargo.toml b/Cargo.toml index b5777f3..9ae38be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,11 @@ edition = "2024" [dependencies] clap = { version = "4.5.54", features = ["derive", "env"] } -reqwest = { version = "0.13.1", features = ["blocking", "json"] } +reqwest = { version = "0.13.1", default-features = false, features = [ + "blocking", + "json", + "rustls", +] } anyhow = "1.0" fluent-templates = "0.13.2" unic-langid = "0.9.6" From 60a1a87d040ab2e0395421012f5023ef6f26383a Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Sun, 4 Jan 2026 07:57:15 -0400 Subject: [PATCH 23/64] Testing workflow --- Cargo.lock | 2 ++ Cargo.toml | 1 + 2 files changed, 3 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 3d79d14..4918cbe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1961,6 +1961,7 @@ checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" dependencies = [ "aws-lc-rs", "once_cell", + "ring", "rustls-pki-types", "rustls-webpki", "subtle", @@ -2678,6 +2679,7 @@ dependencies = [ "ratatui", "rayon", "reqwest", + "rustls", "serde", "serde_json", "sys-locale", diff --git a/Cargo.toml b/Cargo.toml index 9ae38be..ddcead8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,6 +22,7 @@ ratatui = "0.30.0" crossterm = "0.29.0" chrono = "0.4.42" rayon = "1.11.0" +rustls = { version = "0.23.35", default-features = false, features = ["ring"] } [features] default = [] From d80bc544dcfe09348f7bb24ca482eb83c8f1bfdd Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Sun, 4 Jan 2026 11:35:44 -0400 Subject: [PATCH 24/64] Testing workflow --- .forgejo/workflows/release.yaml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index dbd0374..16122a8 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -17,11 +17,14 @@ jobs: - target: x86_64-unknown-linux-gnu cross: true platform: linux/amd64 + deps: "gcc-x86-64-linux-gnu libc6-dev-amd64-cross" + env: + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER: x86_64-linux-gnu-gcc - target: x86_64-pc-windows-gnu cross: true platform: linux/amd64 - deps: "build-essential gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64" + deps: "gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 cmake nasm" env: CC_x86_64_pc_windows_gnu: x86_64-w64-mingw32-gcc CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER: x86_64-w64-mingw32-gcc @@ -36,7 +39,7 @@ jobs: toolchain: stable - name: Add Rust target - if: matrix.target != 'native' && !matrix.container + if: matrix.target != 'native' run: rustup target add ${{ matrix.target }} - name: Cache Rust dependencies @@ -73,13 +76,15 @@ jobs: with: args: > sh -c " - apt-get update && apt-get install -y build-essential libssl-dev pkg-config gcc-x86-64-linux-gnu && - rustup target add x86_64-unknown-linux-gnu && + apt-get update && apt-get install -y build-essential ${{ matrix.deps }} pkg-config && + mkdir -p ~/.cargo && + echo '[target.x86_64-unknown-linux-gnu]\nlinker = \"x86_64-linux-gnu-gcc\"' > ~/.cargo/config.toml && cargo build --release --target x86_64-unknown-linux-gnu && mkdir -p release-artifacts && cp target/x86_64-unknown-linux-gnu/release/uptime-kuma-dashboard release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && strip release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && chmod +x release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu" + env: ${{ matrix.env }} options: --platform ${{ matrix.platform }} - name: Cross-Build Windows x86_64 Release @@ -89,7 +94,6 @@ jobs: args: > sh -c " apt-get update && apt-get install -y ${{ matrix.deps }} && - rustup target add x86_64-pc-windows-gnu && cargo build --release --target x86_64-pc-windows-gnu && mkdir -p release-artifacts && cp target/x86_64-pc-windows-gnu/release/uptime-kuma-dashboard.exe release-artifacts/uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe && @@ -169,5 +173,5 @@ jobs: ``` ### 🏗️ Build Information - Runner Architecture: ${{ env.RUNNER_ARCH }} - - Rust Version: 1.84.0 + - Rust Version: 1.92.0 - Build Type: Release (optimized) From 4347996e2bdd325798867e72deb45e03d50ff278 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Sun, 4 Jan 2026 15:31:47 -0400 Subject: [PATCH 25/64] Testing workflow --- .forgejo/workflows/release.yaml | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 16122a8..7b8fa84 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -17,7 +17,7 @@ jobs: - target: x86_64-unknown-linux-gnu cross: true platform: linux/amd64 - deps: "gcc-x86-64-linux-gnu libc6-dev-amd64-cross" + deps: "build-essential gcc-x86-64-linux-gnu libc6-dev-amd64-cross pkg-config" env: CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER: x86_64-linux-gnu-gcc @@ -38,10 +38,6 @@ jobs: with: toolchain: stable - - name: Add Rust target - if: matrix.target != 'native' - run: rustup target add ${{ matrix.target }} - - name: Cache Rust dependencies uses: https://code.forgejo.org/actions/cache@v4 with: @@ -76,14 +72,15 @@ jobs: with: args: > sh -c " - apt-get update && apt-get install -y build-essential ${{ matrix.deps }} pkg-config && + rustup target add ${{ matrix.target }} && + apt-get update && apt-get install -y ${{ matrix.deps }} && mkdir -p ~/.cargo && - echo '[target.x86_64-unknown-linux-gnu]\nlinker = \"x86_64-linux-gnu-gcc\"' > ~/.cargo/config.toml && - cargo build --release --target x86_64-unknown-linux-gnu && + echo '[target.${{ matrix.target }}]\nlinker = \"x86_64-linux-gnu-gcc\"' > ~/.cargo/config.toml && + cargo build --release --target ${{ matrix.target }} && mkdir -p release-artifacts && - cp target/x86_64-unknown-linux-gnu/release/uptime-kuma-dashboard release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && - strip release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu && - chmod +x release-artifacts/uptime-kuma-dashboard-x86_64-unknown-linux-gnu" + cp target/${{ matrix.target }}/release/uptime-kuma-dashboard release-artifacts/uptime-kuma-dashboard-${{ matrix.target }} && + strip release-artifacts/uptime-kuma-dashboard-${{ matrix.target }} && + chmod +x release-artifacts/uptime-kuma-dashboard-${{ matrix.target }}" env: ${{ matrix.env }} options: --platform ${{ matrix.platform }} @@ -93,10 +90,11 @@ jobs: with: args: > sh -c " + rustup target add ${{ matrix.target }} && apt-get update && apt-get install -y ${{ matrix.deps }} && - cargo build --release --target x86_64-pc-windows-gnu && + cargo build --release --target ${{ matrix.target }} && mkdir -p release-artifacts && - cp target/x86_64-pc-windows-gnu/release/uptime-kuma-dashboard.exe release-artifacts/uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe && + cp target/${{ matrix.target }}/release/uptime-kuma-dashboard.exe release-artifacts/uptime-kuma-dashboard-${{ matrix.target }}.exe && ls -lh release-artifacts/" env: ${{ matrix.env }} options: --platform ${{ matrix.platform }} From 97b16624b6f880bad82e18bbcffe612c7ac49325 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Sun, 4 Jan 2026 16:41:18 -0400 Subject: [PATCH 26/64] Testing workflow --- .forgejo/workflows/release.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 7b8fa84..f794a1d 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -17,7 +17,7 @@ jobs: - target: x86_64-unknown-linux-gnu cross: true platform: linux/amd64 - deps: "build-essential gcc-x86-64-linux-gnu libc6-dev-amd64-cross pkg-config" + deps: "build-essential gcc-x86-64-linux-gnu libc6-dev-amd64-cross pkg-config binutils-x86-64-linux-gnu" env: CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER: x86_64-linux-gnu-gcc @@ -79,7 +79,7 @@ jobs: cargo build --release --target ${{ matrix.target }} && mkdir -p release-artifacts && cp target/${{ matrix.target }}/release/uptime-kuma-dashboard release-artifacts/uptime-kuma-dashboard-${{ matrix.target }} && - strip release-artifacts/uptime-kuma-dashboard-${{ matrix.target }} && + x86_64-linux-gnu-strip release-artifacts/uptime-kuma-dashboard-${{ matrix.target }} && chmod +x release-artifacts/uptime-kuma-dashboard-${{ matrix.target }}" env: ${{ matrix.env }} options: --platform ${{ matrix.platform }} From 12e3a30325334ca70ee4a423df8eb1ed8a0e2c0e Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 5 Jan 2026 11:05:06 -0400 Subject: [PATCH 27/64] Testing workflow --- .forgejo/workflows/release.yaml | 1 + src/ui/app.rs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index f794a1d..8b058b8 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -119,6 +119,7 @@ jobs: uses: https://data.forgejo.org/forgejo/download-artifact@v4 with: path: all-artifacts/ + debug: true - name: Prepare release artifacts run: | diff --git a/src/ui/app.rs b/src/ui/app.rs index 18fa818..8403362 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -188,7 +188,7 @@ impl App { } Err(e) => { let mut error = HashMap::new(); - error.insert("error", e.to_string()); + error.insert("error", e.root_cause().to_string()); self.state.error_message = Some(t_with_args("update-fail", &error)); } } From 4eb4c64398e9c823f23de6d3d12aabd922252bcf Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 5 Jan 2026 11:50:50 -0400 Subject: [PATCH 28/64] Testing workflow --- .forgejo/workflows/release.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 8b058b8..24fa20b 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -119,7 +119,6 @@ jobs: uses: https://data.forgejo.org/forgejo/download-artifact@v4 with: path: all-artifacts/ - debug: true - name: Prepare release artifacts run: | @@ -135,14 +134,15 @@ jobs: - name: Create Release uses: https://code.forgejo.org/actions/forgejo-release@v2 - env: - FORGEJO_TOKEN: ${{ secrets.FORGEJO_TOKEN }} with: direction: upload + url: https://git.marcodearaujo.com + repo: marcodearaujo/uptime-kuma-dashboard + token: ${{ secrets.FORGEJO_TOKEN }} release-dir: release-artifacts title: "Release ${{ forgejo.ref_name }}" tag: ${{ forgejo.ref_name }} - release-notes:: | + release-notes: | ## 🚀 Multi-Platform Release Compiled on runner **${{ env.RUNNER_ARCH }}** ### 📦 Available Binaries From 349e0cf3ff6aba4d2c0187b114c05f77a0952b31 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 5 Jan 2026 13:51:55 -0400 Subject: [PATCH 29/64] Refactoring --- src/api/client.rs | 29 ++++++++++++++++++----------- src/api/endpoints.rs | 22 ++++++++++++++++++++-- src/ui/app.rs | 2 +- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/api/client.rs b/src/api/client.rs index acb68ae..eb3032f 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -19,23 +19,30 @@ impl UptimeKumaClient { } pub fn fetch_heartbeat(&self, endpoints: &UptimeKumaEndpoints) -> Result { - let response = self.client.get(endpoints.heartbeat_url()).send()?; - - if response.status().is_success() { - let json_text = response.text()?; - data::heartbeat::parse_response(&json_text) - } else { - return Err(anyhow::anyhow!(response.status())); - } + self.fetch_and_parse(endpoints.heartbeat_url(), data::heartbeat::parse_response) } pub fn fetch_status_page(&self, endpoints: &UptimeKumaEndpoints) -> Result { - let response = self.client.get(endpoints.status_page_url()).send()?; + self.fetch_and_parse( + endpoints.status_page_url(), + data::status_page::parse_response, + ) + } + + fn fetch_and_parse(&self, url: String, parser: F) -> Result + where + F: FnOnce(&str) -> Result, + { + let response = self.client.get(url.clone()).send()?; if response.status().is_success() { let json_text = response.text()?; - data::status_page::parse_response(&json_text) + parser(&json_text) } else { - return Err(anyhow::anyhow!(response.status())); + Err(anyhow::anyhow!( + "URL: {}, Error: {}", + url, + response.status() + )) } } } diff --git a/src/api/endpoints.rs b/src/api/endpoints.rs index 884472c..9004f3d 100644 --- a/src/api/endpoints.rs +++ b/src/api/endpoints.rs @@ -16,10 +16,28 @@ impl UptimeKumaEndpoints { } pub fn heartbeat_url(&self) -> String { - format!("{}api/status-page/heartbeat/{}", self.base_url, self.slug) + let mut url = self.get_url(); + url.path_segments_mut() + .unwrap() + .push("heartbeat") + .push(&self.slug); + url.to_string() } pub fn status_page_url(&self) -> String { - format!("{}api/status-page/{}", self.base_url, self.slug) + let mut url = self.get_url(); + url.path_segments_mut() + .unwrap() + .push(&self.slug); + url.to_string() + } + + fn get_url(&self) -> Url { + let mut url = self.base_url.clone(); + url.path_segments_mut() + .unwrap() + .push("api") + .push("status-page"); + url } } diff --git a/src/ui/app.rs b/src/ui/app.rs index 8403362..18fa818 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -188,7 +188,7 @@ impl App { } Err(e) => { let mut error = HashMap::new(); - error.insert("error", e.root_cause().to_string()); + error.insert("error", e.to_string()); self.state.error_message = Some(t_with_args("update-fail", &error)); } } From 89bf217afd790631455665a99b0bedbdd8540e0d Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 5 Jan 2026 13:52:50 -0400 Subject: [PATCH 30/64] Update type --- src/data/heartbeat/model.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/heartbeat/model.rs b/src/data/heartbeat/model.rs index e2a0107..d4ed8cf 100644 --- a/src/data/heartbeat/model.rs +++ b/src/data/heartbeat/model.rs @@ -13,7 +13,7 @@ pub struct HeartbeatEntry { #[serde(skip)] pub msg: String, #[serde(default)] - pub ping: Option, + pub ping: Option, } #[derive(Debug, Clone, Deserialize, Serialize)] From 78d0e553afb05f1061e2ea211d341086997f1676 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 5 Jan 2026 14:15:51 -0400 Subject: [PATCH 31/64] Testing workflow --- .forgejo/workflows/release.yaml | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml index 24fa20b..4b2ee51 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/release.yaml @@ -66,6 +66,10 @@ jobs: chmod +x "release-artifacts/$OUTPUT_NAME" ls -lh "release-artifacts/$OUTPUT_NAME" + - name: Get Rust version + id: rust-version + run: echo "version=$(rustc --version | cut -d' ' -f2)" >> $GITHUB_OUTPUT + - name: Cross-Build Linux x86_64 Release if: matrix.target == 'x86_64-unknown-linux-gnu' uses: docker://rust:slim @@ -144,12 +148,14 @@ jobs: tag: ${{ forgejo.ref_name }} release-notes: | ## 🚀 Multi-Platform Release - Compiled on runner **${{ env.RUNNER_ARCH }}** + Compiled on Forgejo Runner **${{ runner.arch }}** + ### 📦 Available Binaries This release includes binaries for the following platforms: - **Linux x86_64** (Intel/AMD 64-bit) - **Linux ARM64** (aarch64) - Raspberry Pi 4, ARM servers - **Windows x86_64** (64-bit) + ### 🚀 How to use #### Linux/ARM: ```bash @@ -160,17 +166,20 @@ jobs: # Run ./uptime-kuma-dashboard-* --base-url https://your-kuma --slug your-slug ``` + #### Windows: ```powershell # Download uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe # Run in PowerShell or CMD .\uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe --base-url https://your-kuma --slug your-slug ``` + ### ✅ Verify Checksums ```bash sha256sum -c SHA256SUMS.txt ``` + ### 🏗️ Build Information - - Runner Architecture: ${{ env.RUNNER_ARCH }} - - Rust Version: 1.92.0 - - Build Type: Release (optimized) + - Rust Version: ${{ steps.rust-version.outputs.version }} + - Build Date: $(date +'%Y-%m-%d') + - Build Type: Release (optimized with LTO) From a8467a3cf154b8edf3f89b66943c733eb9fa0b0d Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 5 Jan 2026 15:53:04 -0400 Subject: [PATCH 32/64] Testing workflow --- .forgejo/workflows/{release.yaml => pre-release.yaml} | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) rename .forgejo/workflows/{release.yaml => pre-release.yaml} (98%) diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/pre-release.yaml similarity index 98% rename from .forgejo/workflows/release.yaml rename to .forgejo/workflows/pre-release.yaml index 4b2ee51..cc30347 100644 --- a/.forgejo/workflows/release.yaml +++ b/.forgejo/workflows/pre-release.yaml @@ -2,7 +2,7 @@ name: Multi-Platform Release Build on: push: tags: - - "v*.*.*" + - "v*.*.*-*" jobs: build: runs-on: docker @@ -144,7 +144,8 @@ jobs: repo: marcodearaujo/uptime-kuma-dashboard token: ${{ secrets.FORGEJO_TOKEN }} release-dir: release-artifacts - title: "Release ${{ forgejo.ref_name }}" + title: "Pre-Release ${{ forgejo.ref_name }}" + prerelease: true tag: ${{ forgejo.ref_name }} release-notes: | ## 🚀 Multi-Platform Release From fba0d174032a21d9d9b30634030295503a44d130 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 5 Jan 2026 16:40:35 -0400 Subject: [PATCH 33/64] Testing workflow --- .forgejo/workflows/pre-release.yaml | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/.forgejo/workflows/pre-release.yaml b/.forgejo/workflows/pre-release.yaml index cc30347..140136c 100644 --- a/.forgejo/workflows/pre-release.yaml +++ b/.forgejo/workflows/pre-release.yaml @@ -159,26 +159,20 @@ jobs: ### 🚀 How to use #### Linux/ARM: - ```bash - # Download the appropriate binary - wget https://your-forgejo.com/releases/download/${{ forgejo.ref_name }}/uptime-kuma-dashboard- - # Make executable - chmod +x uptime-kuma-dashboard-* - # Run - ./uptime-kuma-dashboard-* --base-url https://your-kuma --slug your-slug - ``` + # Download the appropriate binary + wget https://your-forgejo.com/releases/download/${{ forgejo.ref_name }}/uptime-kuma-dashboard- + # Make executable + chmod +x uptime-kuma-dashboard-* + # Run + ./uptime-kuma-dashboard-* --base-url https://your-kuma --slug your-slug #### Windows: - ```powershell - # Download uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe - # Run in PowerShell or CMD - .\uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe --base-url https://your-kuma --slug your-slug - ``` + # Download uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe + # Run in PowerShell or CMD + .\uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe --base-url https://your-kuma --slug your-slug ### ✅ Verify Checksums - ```bash - sha256sum -c SHA256SUMS.txt - ``` + sha256sum -c SHA256SUMS.txt ### 🏗️ Build Information - Rust Version: ${{ steps.rust-version.outputs.version }} From d4e3ce6e270a372ddd47af382cab94f7fddf488d Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Wed, 7 Jan 2026 10:33:16 -0400 Subject: [PATCH 34/64] Update Cargo.toml --- Cargo.lock | 12 ++++++------ Cargo.toml | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4918cbe..9e0c1a1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1955,9 +1955,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.35" +version = "0.23.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" dependencies = [ "aws-lc-rs", "once_cell", @@ -2132,9 +2132,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.148" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3084b546a1dd6289475996f182a22aba973866ea8e8b02c51d9f46b1336a22da" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", @@ -2689,9 +2689,9 @@ dependencies = [ [[package]] name = "url" -version = "2.5.7" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ "form_urlencoded", "idna", diff --git a/Cargo.toml b/Cargo.toml index ddcead8..d25d063 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,14 +15,14 @@ fluent-templates = "0.13.2" unic-langid = "0.9.6" sys-locale = "0.3.2" serde = { version = "1.0", features = ["derive"] } -serde_json = "1.0.148" +serde_json = "1.0.149" once_cell = "1.19" -url = "2.5.7" +url = "2.5.8" ratatui = "0.30.0" crossterm = "0.29.0" chrono = "0.4.42" rayon = "1.11.0" -rustls = { version = "0.23.35", default-features = false, features = ["ring"] } +rustls = { version = "0.23.36", default-features = false, features = ["ring"] } [features] default = [] From 142f76684b386b097fc9b1d6fc3acf271120c2d0 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 8 Jan 2026 09:25:26 -0400 Subject: [PATCH 35/64] Show vertical scrollbar only if height is lower than total monitors --- src/ui/app.rs | 44 ++++++++++++++++--- src/ui/components/monitor_list.rs | 54 ++++++++++-------------- src/ui/dashboard/model.rs | 70 +++++++++++++++++++------------ 3 files changed, 105 insertions(+), 63 deletions(-) diff --git a/src/ui/app.rs b/src/ui/app.rs index 18fa818..4a6c144 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -18,7 +18,7 @@ use ratatui::{ layout::{Alignment, Constraint, Direction, Layout, Rect}, style::{Color, Modifier, Style}, text::{Line, Span, Text}, - widgets::{Block, Borders, Padding, Paragraph}, + widgets::{Block, Borders, Padding, Paragraph, Scrollbar, ScrollbarOrientation}, }; use std::{ @@ -128,14 +128,26 @@ impl App { render_header(frame, chunks[0], &self.state); + let mut main_constraint = Vec::with_capacity(2); + main_constraint.push(Constraint::Min(1)); + + if self.state.show_vertical_scrollbar(chunks[1].height) { + main_constraint.push(Constraint::Length(1)); + } + + let main_chunks = Layout::default() + .direction(Direction::Horizontal) + .constraints(main_constraint) + .split(chunks[1]); + if self.state.is_loading { - Self::render_loading(frame, chunks[1]); + Self::render_loading(frame, main_chunks[0]); } else if let Some(error) = &self.state.error_message { - Self::render_error(frame, chunks[1], error); + Self::render_error(frame, main_chunks[0], error); } else if self.state.groups.is_empty() || self.state.get_all_monitors().is_empty() { - Self::render_no_data(frame, chunks[1]); + Self::render_no_data(frame, main_chunks[0]); } else { - render_monitor_list(frame, chunks[1], &self.state); + Self::render_main(frame, main_chunks.to_vec(), &mut self.state); } let seconds_until_update = self @@ -148,6 +160,22 @@ impl App { }); } + fn render_main(frame: &mut Frame, area: Vec, state: &mut DashboardViewState) { + render_monitor_list(frame, area[0], state); + + let total_monitors = state.get_all_monitors().len(); + + if area[0].height > total_monitors as u16 { + return; + } + + let scrollbar = Scrollbar::new(ScrollbarOrientation::VerticalRight) + .begin_symbol(Some("↑")) + .end_symbol(Some("↓")); + + frame.render_stateful_widget(scrollbar, area[1], &mut state.scroll_state); + } + fn handle_events(&mut self) -> io::Result<()> { let timeout = Duration::from_secs(1); @@ -159,6 +187,12 @@ impl App { match key.code { KeyCode::Char('q') | KeyCode::Esc => self.should_quit = true, + KeyCode::Up | KeyCode::Char('k') => { + self.state.scroll_state.prev(); + } + KeyCode::Down | KeyCode::Char('j') => { + self.state.scroll_state.next(); + } _ => {} } } diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index e0b1c91..31dd468 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -16,43 +16,29 @@ use ratatui::{ const STATUS_LINE_LENGTH: usize = 100; const MAX_NAME_LENGTH: usize = 30; -pub fn render_monitor_list(frame: &mut Frame, area: Rect, state: &DashboardViewState) { - let group_areas = layout_groups(area, &state.groups); +pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &DashboardViewState) { + let constraints: Vec = state + .groups + .iter() + .map(|g| { + let height_neeed = 3 + g.monitors.len(); + Constraint::Length(height_neeed as u16) + }) + .collect(); + + if constraints.is_empty() { + return; + } + + let group_areas = Layout::vertical(constraints).split(area); for (i, (group, &group_area)) in state.groups.iter().zip(group_areas.iter()).enumerate() { - render_group(frame, group_area, group, i == 0); + if group_area.height > 0 { + render_group(main_frame, group_area, group, i == 0); + } } } -fn layout_groups(area: Rect, groups: &[GroupViewState]) -> Vec { - let total_lines: usize = groups.iter().map(|g| g.monitors.len() + 1).sum(); - - if total_lines == 0 { - return Vec::new(); - } - - let content_height = area.height.saturating_sub(2); - let line_height = content_height as usize / total_lines; - - let mut current_y = area.y + 1; - let mut areas = Vec::with_capacity(groups.len()); - - for group in groups { - let group_lines = group.monitors.len() + 2; - let group_height = (group_lines + line_height).max(1); - areas.push(Rect { - x: area.x, - y: current_y, - width: area.width, - height: group_height as u16, - }); - - current_y += group_height as u16; - } - - areas -} - fn render_group(frame: &mut Frame, area: Rect, group: &GroupViewState, is_first: bool) { let chunks = Layout::default() .direction(Direction::Vertical) @@ -60,6 +46,10 @@ fn render_group(frame: &mut Frame, area: Rect, group: &GroupViewState, is_first: .constraints([Constraint::Length(1), Constraint::Min(1)]) .split(area); + if chunks[0].height <= 0 || chunks[1].height <= 0 || group.monitors.is_empty() { + return; + } + let group_title = Line::from(vec![ Span::styled(format!("{} ", group.name), title_style()), Span::styled( diff --git a/src/ui/dashboard/model.rs b/src/ui/dashboard/model.rs index 8f24c42..c408c54 100644 --- a/src/ui/dashboard/model.rs +++ b/src/ui/dashboard/model.rs @@ -1,8 +1,11 @@ use crate::core::models::{UnifiedData, UnifiedGroupData}; use crate::data::heartbeat::model::HeartbeatEntry; use crate::i18n::t; +use ratatui::widgets::ScrollbarState; use rayon::prelude::*; +const BORDER_LINES_VIEW: usize = 3; + #[derive(Debug, Clone, PartialEq)] pub enum MonitorStatus { Up, @@ -33,6 +36,7 @@ pub struct DashboardViewState { pub is_loading: bool, pub error_message: Option, pub auto_refresh_interval: u32, + pub scroll_state: ScrollbarState, } impl DashboardViewState { @@ -44,6 +48,7 @@ impl DashboardViewState { is_loading: true, error_message: None, auto_refresh_interval: 300, + scroll_state: ScrollbarState::new(0), } } @@ -57,6 +62,11 @@ impl DashboardViewState { }); } + let content_length = groups + .iter() + .map(|g| g.monitors.len() + BORDER_LINES_VIEW) + .sum::(); + Self { title: data.title, descriptions: data.description, @@ -64,12 +74,17 @@ impl DashboardViewState { is_loading: false, error_message: None, auto_refresh_interval: data.auto_refresh_interval.max(30), + scroll_state: ScrollbarState::new(content_length.saturating_sub(1)), } } pub fn get_all_monitors(&self) -> Vec<&MonitorViewState> { self.groups.iter().flat_map(|g| g.monitors.iter()).collect() } + + pub fn show_vertical_scrollbar(&self, height: u16) -> bool { + height < self.get_all_monitors().len() as u16 + } } fn get_status_history(heartbeats: &[HeartbeatEntry]) -> Vec { @@ -94,36 +109,39 @@ fn get_status_history(heartbeats: &[HeartbeatEntry]) -> Vec { fn add_monitor_view_state(group: UnifiedGroupData) -> Vec { let mut monitors = Vec::with_capacity(group.monitors.len()); - group.monitors.into_par_iter().map(|monitor| { + group + .monitors + .into_par_iter() + .map(|monitor| { + let status_history = get_status_history(&monitor.heartbeats); - let status_history = get_status_history(&monitor.heartbeats); + let status = match monitor.heartbeats.last().map(|h| h.status) { + Some(1) => MonitorStatus::Up, + Some(0) => MonitorStatus::Down, + _ => MonitorStatus::Unknown, + }; - let status = match monitor.heartbeats.last().map(|h| h.status) { - Some(1) => MonitorStatus::Up, - Some(0) => MonitorStatus::Down, - _ => MonitorStatus::Unknown, - }; + let response_time = monitor + .heartbeats + .last() + .and_then(|h| h.ping) + .map(|ms| format!("{}", ms)) + .unwrap_or_else(|| t("unknown").to_string() + " "); - let response_time = monitor - .heartbeats - .last() - .and_then(|h| h.ping) - .map(|ms| format!("{}", ms)) - .unwrap_or_else(|| t("unknown").to_string() + " "); + let uptime_24h = monitor + .uptime_data + .map(|u| u.get_perc_formated()) + .unwrap_or_else(|| t("unknown").to_string()); - let uptime_24h = monitor - .uptime_data - .map(|u| u.get_perc_formated()) - .unwrap_or_else(|| t("unknown").to_string()); - - MonitorViewState { - name: monitor.name, - status, - response_time, - uptime_24h, - status_history, - } - }).collect_into_vec(&mut monitors); + MonitorViewState { + name: monitor.name, + status, + response_time, + uptime_24h, + status_history, + } + }) + .collect_into_vec(&mut monitors); monitors.sort_by_key(|m| m.name.clone()); From 74464f6a482aa8acf2f433dbf0e82d86eb71cc23 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 8 Jan 2026 13:33:37 -0400 Subject: [PATCH 36/64] Partial fix where height is lower than total monitors, but there is no area for scrollbar (area.len() == 1) --- src/ui/app.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/ui/app.rs b/src/ui/app.rs index 4a6c144..68a2d48 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -163,9 +163,13 @@ impl App { fn render_main(frame: &mut Frame, area: Vec, state: &mut DashboardViewState) { render_monitor_list(frame, area[0], state); - let total_monitors = state.get_all_monitors().len(); + if !state.show_vertical_scrollbar(area[0].height) { + return; + } - if area[0].height > total_monitors as u16 { + if area.len() <= 1 { + let _formgen = area[0].height; + dbg!(area[0].height); return; } From 4e17ef1e09575e55819b7dc8ef9fe0272b03f9d9 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 8 Jan 2026 14:30:22 -0400 Subject: [PATCH 37/64] Small fix --- src/ui/app.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/ui/app.rs b/src/ui/app.rs index 68a2d48..76dead9 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -218,7 +218,6 @@ impl App { fn refresh_data(&mut self) -> io::Result<()> { self.state.is_loading = true; - self.render(); match self.fetch_and_update_data() { Ok(()) => { From df1d1dddc6759fcfdff8494f7350c4ecd3934670 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Fri, 9 Jan 2026 11:56:35 -0400 Subject: [PATCH 38/64] Scrollbar initial values --- src/ui/app.rs | 30 ++++++++++++++++++++---------- src/ui/components/monitor_list.rs | 4 ++-- src/ui/dashboard/model.rs | 7 +++++-- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/src/ui/app.rs b/src/ui/app.rs index 76dead9..4d2dbca 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -116,13 +116,19 @@ impl App { fn render(&mut self) { let _ = self.terminal.draw(|frame| { let area = frame.area(); + + const HEADER_HEIGHT: u16 = 3; + const FOOTER_HEIGHT: u16 = 3; + + let max_content_height = area.height.saturating_sub(HEADER_HEIGHT + FOOTER_HEIGHT); + let chunks = Layout::default() .direction(Direction::Vertical) .margin(1) .constraints([ - Constraint::Length(3), - Constraint::Min(1), - Constraint::Length(3), + Constraint::Length(HEADER_HEIGHT), + Constraint::Length(max_content_height.max(1)), + Constraint::Length(FOOTER_HEIGHT), ]) .split(area); @@ -177,7 +183,13 @@ impl App { .begin_symbol(Some("↑")) .end_symbol(Some("↓")); - frame.render_stateful_widget(scrollbar, area[1], &mut state.scroll_state); + frame.render_stateful_widget( + scrollbar, + area[1], + &mut state + .scroll_state + .viewport_content_length(area[0].height as usize), + ); } fn handle_events(&mut self) -> io::Result<()> { @@ -191,12 +203,10 @@ impl App { match key.code { KeyCode::Char('q') | KeyCode::Esc => self.should_quit = true, - KeyCode::Up | KeyCode::Char('k') => { - self.state.scroll_state.prev(); - } - KeyCode::Down | KeyCode::Char('j') => { - self.state.scroll_state.next(); - } + KeyCode::Up | KeyCode::Char('k') => self.state.scroll_state.prev(), + KeyCode::Down | KeyCode::Char('j') => self.state.scroll_state.next(), + KeyCode::Home => self.state.scroll_state.first(), + KeyCode::End => self.state.scroll_state.last(), _ => {} } } diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index 31dd468..0fc4256 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -3,7 +3,7 @@ use std::cmp::min; use crate::i18n::t; use crate::ui::dashboard::{ MonitorStatus, MonitorViewState, - model::{DashboardViewState, GroupViewState}, + model::{DashboardViewState, GroupViewState, BORDER_LINES_VIEW}, }; use ratatui::{ Frame, @@ -21,7 +21,7 @@ pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &Dashboard .groups .iter() .map(|g| { - let height_neeed = 3 + g.monitors.len(); + let height_neeed = BORDER_LINES_VIEW + g.monitors.len(); Constraint::Length(height_neeed as u16) }) .collect(); diff --git a/src/ui/dashboard/model.rs b/src/ui/dashboard/model.rs index c408c54..a375ed9 100644 --- a/src/ui/dashboard/model.rs +++ b/src/ui/dashboard/model.rs @@ -4,7 +4,7 @@ use crate::i18n::t; use ratatui::widgets::ScrollbarState; use rayon::prelude::*; -const BORDER_LINES_VIEW: usize = 3; +pub const BORDER_LINES_VIEW: usize = 3; #[derive(Debug, Clone, PartialEq)] pub enum MonitorStatus { @@ -37,6 +37,7 @@ pub struct DashboardViewState { pub error_message: Option, pub auto_refresh_interval: u32, pub scroll_state: ScrollbarState, + content_length: usize, } impl DashboardViewState { @@ -49,6 +50,7 @@ impl DashboardViewState { error_message: None, auto_refresh_interval: 300, scroll_state: ScrollbarState::new(0), + content_length: 0, } } @@ -75,6 +77,7 @@ impl DashboardViewState { error_message: None, auto_refresh_interval: data.auto_refresh_interval.max(30), scroll_state: ScrollbarState::new(content_length.saturating_sub(1)), + content_length, } } @@ -83,7 +86,7 @@ impl DashboardViewState { } pub fn show_vertical_scrollbar(&self, height: u16) -> bool { - height < self.get_all_monitors().len() as u16 + height < self.content_length as u16 } } From 000e31a14f127f6bb7b6672f2d94f9596d73e057 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Sat, 10 Jan 2026 11:19:19 -0400 Subject: [PATCH 39/64] Working scrollbar --- src/ui/app.rs | 1 - src/ui/components/footer.rs | 6 +++- src/ui/components/monitor_list.rs | 57 ++++++++++++++++++++++--------- src/ui/dashboard/model.rs | 20 ++++++----- 4 files changed, 58 insertions(+), 26 deletions(-) diff --git a/src/ui/app.rs b/src/ui/app.rs index 4d2dbca..96e2e2d 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -174,7 +174,6 @@ impl App { } if area.len() <= 1 { - let _formgen = area[0].height; dbg!(area[0].height); return; } diff --git a/src/ui/components/footer.rs b/src/ui/components/footer.rs index 806002b..9a79434 100644 --- a/src/ui/components/footer.rs +++ b/src/ui/components/footer.rs @@ -9,7 +9,11 @@ use ratatui::{ use crate::i18n::t; use chrono::Local; -pub fn render_footer(frame: &mut Frame, area: Rect, seconds_until_update: u64) { +pub fn render_footer( + frame: &mut Frame, + area: Rect, + seconds_until_update: u64 +) { let now = Local::now(); let datatime_str = now.format("%Y-%m-%d %H:%M:%S").to_string(); let countdown_str = format!("↻ {}s", seconds_until_update); diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index 0fc4256..df9f28c 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -3,7 +3,7 @@ use std::cmp::min; use crate::i18n::t; use crate::ui::dashboard::{ MonitorStatus, MonitorViewState, - model::{DashboardViewState, GroupViewState, BORDER_LINES_VIEW}, + model::{BORDER_LINES_VIEW, DashboardViewState, GroupViewState}, }; use ratatui::{ Frame, @@ -16,26 +16,51 @@ use ratatui::{ const STATUS_LINE_LENGTH: usize = 100; const MAX_NAME_LENGTH: usize = 30; -pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &DashboardViewState) { - let constraints: Vec = state - .groups - .iter() - .map(|g| { - let height_neeed = BORDER_LINES_VIEW + g.monitors.len(); - Constraint::Length(height_neeed as u16) - }) - .collect(); +pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut DashboardViewState) { + let available_height = area.height as usize; + let total_lenght = state.get_total_lenght(); - if constraints.is_empty() { - return; + if (state.scroll_state.get_position() + available_height) > total_lenght { + state.scroll_state = state.scroll_state.position(total_lenght - available_height); } - let group_areas = Layout::vertical(constraints).split(area); + let scroll_pos = state.scroll_state.get_position(); + let mut current_y = area.y as usize; + let mut rendered_height = 0; + let mut lines_skipped = 0; - for (i, (group, &group_area)) in state.groups.iter().zip(group_areas.iter()).enumerate() { - if group_area.height > 0 { - render_group(main_frame, group_area, group, i == 0); + for (i, group) in state.groups.iter().enumerate() { + let group_height = group.monitors.len() + BORDER_LINES_VIEW; + + if lines_skipped + group_height <= scroll_pos { + lines_skipped += group_height; + continue; } + + let visible_height = if lines_skipped < scroll_pos { + group_height - (scroll_pos - lines_skipped) + } else { + group_height + } + .min(available_height - rendered_height); + + let group_area = Rect { + x: area.x, + y: current_y as u16, + width: area.width, + height: visible_height as u16, + }; + + render_group( + main_frame, + group_area, + group, + i == 0 && lines_skipped >= scroll_pos, + ); + + current_y += visible_height; + rendered_height += visible_height; + lines_skipped += group_height; } } diff --git a/src/ui/dashboard/model.rs b/src/ui/dashboard/model.rs index a375ed9..1d689e0 100644 --- a/src/ui/dashboard/model.rs +++ b/src/ui/dashboard/model.rs @@ -37,7 +37,7 @@ pub struct DashboardViewState { pub error_message: Option, pub auto_refresh_interval: u32, pub scroll_state: ScrollbarState, - content_length: usize, + total_length: usize, } impl DashboardViewState { @@ -50,7 +50,7 @@ impl DashboardViewState { error_message: None, auto_refresh_interval: 300, scroll_state: ScrollbarState::new(0), - content_length: 0, + total_length: 0, } } @@ -64,10 +64,10 @@ impl DashboardViewState { }); } - let content_length = groups + let total_length: usize = groups .iter() .map(|g| g.monitors.len() + BORDER_LINES_VIEW) - .sum::(); + .sum(); Self { title: data.title, @@ -76,17 +76,21 @@ impl DashboardViewState { is_loading: false, error_message: None, auto_refresh_interval: data.auto_refresh_interval.max(30), - scroll_state: ScrollbarState::new(content_length.saturating_sub(1)), - content_length, + scroll_state: ScrollbarState::new(total_length.saturating_sub(1)), + total_length, } } + pub fn get_total_lenght(&self) -> usize { + self.total_length + } + pub fn get_all_monitors(&self) -> Vec<&MonitorViewState> { self.groups.iter().flat_map(|g| g.monitors.iter()).collect() } - pub fn show_vertical_scrollbar(&self, height: u16) -> bool { - height < self.content_length as u16 + pub fn show_vertical_scrollbar(&self, available_height: u16) -> bool { + self.total_length as u16 > available_height } } From 60e4fa3b9d9437d17a3118c14041f001659b59bc Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Sun, 11 Jan 2026 14:06:12 -0400 Subject: [PATCH 40/64] Fixing scrollbar view content --- src/ui/app.rs | 18 +++++++++++------- src/ui/components/monitor_list.rs | 6 +++--- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/ui/app.rs b/src/ui/app.rs index 96e2e2d..9791d8b 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -178,17 +178,21 @@ impl App { return; } + let max_scroll = state + .get_total_lenght() + .saturating_sub(area[0].height as usize) + .saturating_add(1); + + state.scroll_state = state + .scroll_state + .content_length(max_scroll.max(1)) + .viewport_content_length(area[0].height as usize); + let scrollbar = Scrollbar::new(ScrollbarOrientation::VerticalRight) .begin_symbol(Some("↑")) .end_symbol(Some("↓")); - frame.render_stateful_widget( - scrollbar, - area[1], - &mut state - .scroll_state - .viewport_content_length(area[0].height as usize), - ); + frame.render_stateful_widget(scrollbar, area[1], &mut state.scroll_state); } fn handle_events(&mut self) -> io::Result<()> { diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index df9f28c..ee36f8a 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -18,10 +18,10 @@ const MAX_NAME_LENGTH: usize = 30; pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut DashboardViewState) { let available_height = area.height as usize; - let total_lenght = state.get_total_lenght(); + let max_scroll = state.get_total_lenght().saturating_sub(available_height); - if (state.scroll_state.get_position() + available_height) > total_lenght { - state.scroll_state = state.scroll_state.position(total_lenght - available_height); + if state.scroll_state.get_position() > max_scroll { + state.scroll_state = state.scroll_state.position(max_scroll); } let scroll_pos = state.scroll_state.get_position(); From 6109785e634f451f74ddf1a3269cd1d350d4b3c0 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 12 Jan 2026 04:03:12 -0400 Subject: [PATCH 41/64] Small fixes --- src/ui/components/monitor_list.rs | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index ee36f8a..db0be1d 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -28,6 +28,7 @@ pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut Dashb let mut current_y = area.y as usize; let mut rendered_height = 0; let mut lines_skipped = 0; + let half = state.get_total_lenght().saturating_div(2); for (i, group) in state.groups.iter().enumerate() { let group_height = group.monitors.len() + BORDER_LINES_VIEW; @@ -55,7 +56,7 @@ pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut Dashb main_frame, group_area, group, - i == 0 && lines_skipped >= scroll_pos, + half > rendered_height , ); current_y += visible_height; @@ -64,7 +65,7 @@ pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut Dashb } } -fn render_group(frame: &mut Frame, area: Rect, group: &GroupViewState, is_first: bool) { +fn render_group(frame: &mut Frame, area: Rect, group: &GroupViewState, is_first_half: bool) { let chunks = Layout::default() .direction(Direction::Vertical) .margin(0) @@ -84,11 +85,7 @@ fn render_group(frame: &mut Frame, area: Rect, group: &GroupViewState, is_first: ]); let title_block = Block::default() - .borders(if is_first { - Borders::TOP | Borders::LEFT | Borders::RIGHT - } else { - Borders::ALL - }) + .borders(Borders::ALL) .border_style(Style::default().fg(Color::Blue)) .title(group_title) .title_alignment(Alignment::Left); @@ -96,13 +93,24 @@ fn render_group(frame: &mut Frame, area: Rect, group: &GroupViewState, is_first: frame.render_widget(title_block, chunks[0]); if !group.monitors.is_empty() { - render_monitor_table(frame, chunks[1], &group.monitors); + render_monitor_table(frame, chunks[1], &group.monitors, is_first_half); } } -fn render_monitor_table(frame: &mut Frame, area: Rect, monitors: &Vec) { +fn render_monitor_table( + frame: &mut Frame, + area: Rect, + monitors: &Vec, + is_first_half: bool, +) { let max_items = area.height as usize; let items_to_show = min(monitors.len(), max_items); + let index = monitors.len().saturating_sub(max_items.saturating_sub(2)); // 2 = Table header + botton + let monitors = if is_first_half { + &monitors[index..].to_vec() + } else { + monitors + }; let header_cells = vec![ "".to_string(), From 3929a4a277723f1122c1168879b86294a1d5130b Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 12 Jan 2026 11:49:37 -0400 Subject: [PATCH 42/64] String optimizations --- src/ui/components/monitor_list.rs | 20 ++++++++++---------- src/ui/dashboard/model.rs | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index db0be1d..210fca4 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -1,3 +1,4 @@ +use std::borrow::Cow; use std::cmp::min; use crate::i18n::t; @@ -52,12 +53,7 @@ pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut Dashb height: visible_height as u16, }; - render_group( - main_frame, - group_area, - group, - half > rendered_height , - ); + render_group(main_frame, group_area, group, half > rendered_height); current_y += visible_height; rendered_height += visible_height; @@ -178,10 +174,14 @@ fn create_monitor_item(monitor: &MonitorViewState) -> Row<'_> { let status_icon = get_status_emoji(&monitor.status); let status_color = get_status_color(&monitor.status); - let display_name: String = if monitor.name.len() > MAX_NAME_LENGTH { - format!("{:.width$}...", &monitor.name, width = MAX_NAME_LENGTH - 3) + let display_name: Cow = if monitor.name.len() > MAX_NAME_LENGTH { + Cow::Owned(format!( + "{:.width$}...", + monitor.name, + width = MAX_NAME_LENGTH - 3 + )) } else { - monitor.name.clone() + Cow::Borrowed(&monitor.name) }; let response_text = format!("{:>7}ms", monitor.response_time); @@ -191,7 +191,7 @@ fn create_monitor_item(monitor: &MonitorViewState) -> Row<'_> { Row::new(vec![ get_formated_line(format!("{} ", status_icon), status_color, Modifier::empty()), - get_formated_line(display_name, Color::White, Modifier::empty()), + get_formated_line(display_name.to_string(), Color::White, Modifier::empty()), get_formated_line(response_text, Color::Cyan, Modifier::empty()), get_formated_line(uptime_text, Color::Magenta, Modifier::empty()), status_line_spans, diff --git a/src/ui/dashboard/model.rs b/src/ui/dashboard/model.rs index 1d689e0..a8e3943 100644 --- a/src/ui/dashboard/model.rs +++ b/src/ui/dashboard/model.rs @@ -3,7 +3,7 @@ use crate::data::heartbeat::model::HeartbeatEntry; use crate::i18n::t; use ratatui::widgets::ScrollbarState; use rayon::prelude::*; - +use std::borrow::Cow; pub const BORDER_LINES_VIEW: usize = 3; #[derive(Debug, Clone, PartialEq)] @@ -15,7 +15,7 @@ pub enum MonitorStatus { #[derive(Debug, Clone)] pub struct MonitorViewState { - pub name: String, + pub name: Cow<'static, str>, pub status: MonitorStatus, pub response_time: String, pub uptime_24h: String, @@ -141,7 +141,7 @@ fn add_monitor_view_state(group: UnifiedGroupData) -> Vec { .unwrap_or_else(|| t("unknown").to_string()); MonitorViewState { - name: monitor.name, + name: Cow::Owned(monitor.name), status, response_time, uptime_24h, From 3d69f530d42b6c63cf66a37ccdb0c9f5e0438f74 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 12 Jan 2026 12:37:28 -0400 Subject: [PATCH 43/64] String Optizations --- src/ui/components/monitor_list.rs | 32 ++++++++++++++++++++----------- src/ui/dashboard/model.rs | 2 +- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index 210fca4..d74b87d 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -1,5 +1,7 @@ use std::borrow::Cow; use std::cmp::min; +use std::collections::HashMap; +use std::sync::OnceLock; use crate::i18n::t; use crate::ui::dashboard::{ @@ -17,6 +19,8 @@ use ratatui::{ const STATUS_LINE_LENGTH: usize = 100; const MAX_NAME_LENGTH: usize = 30; +static STATUS_CHARS: OnceLock>> = OnceLock::new(); + pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut DashboardViewState) { let available_height = area.height as usize; let max_scroll = state.get_total_lenght().saturating_sub(available_height); @@ -31,7 +35,7 @@ pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut Dashb let mut lines_skipped = 0; let half = state.get_total_lenght().saturating_div(2); - for (i, group) in state.groups.iter().enumerate() { + for (_i, group) in state.groups.iter().enumerate() { let group_height = group.monitors.len() + BORDER_LINES_VIEW; if lines_skipped + group_height <= scroll_pos { @@ -146,12 +150,15 @@ fn render_monitor_table( frame.render_widget(table, area); } -pub fn get_status_char(status: &MonitorStatus) -> char { - match status { - MonitorStatus::Up => '■', - MonitorStatus::Down => '■', - MonitorStatus::Unknown => '■', - } +fn get_status_char(status: &MonitorStatus) -> Cow<'static, str> { + let map = STATUS_CHARS.get_or_init(|| { + let mut m = HashMap::new(); + m.insert(MonitorStatus::Up, Cow::Borrowed("■")); + m.insert(MonitorStatus::Down, Cow::Borrowed("■")); + m.insert(MonitorStatus::Unknown, Cow::Borrowed("■")); + m + }); + map.get(status).cloned().unwrap_or(Cow::Borrowed("?")) } pub fn get_status_color(status: &MonitorStatus) -> Color { @@ -162,11 +169,14 @@ pub fn get_status_color(status: &MonitorStatus) -> Color { } } -pub fn get_status_emoji(status: &MonitorStatus) -> &str { +pub fn get_status_emoji(status: &MonitorStatus) -> Cow<'static, str> { + static UP_ICON: &str ="✅"; + static DOWN_ICON: &str ="❌"; + static UNKNOWN_ICON: &str = "❓"; match status { - MonitorStatus::Up => "✅", - MonitorStatus::Down => "❌", - MonitorStatus::Unknown => "❓", + MonitorStatus::Up => Cow::Borrowed(UP_ICON), + MonitorStatus::Down => Cow::Borrowed(DOWN_ICON), + MonitorStatus::Unknown => Cow::Borrowed(UNKNOWN_ICON), } } diff --git a/src/ui/dashboard/model.rs b/src/ui/dashboard/model.rs index a8e3943..6613dc0 100644 --- a/src/ui/dashboard/model.rs +++ b/src/ui/dashboard/model.rs @@ -6,7 +6,7 @@ use rayon::prelude::*; use std::borrow::Cow; pub const BORDER_LINES_VIEW: usize = 3; -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq, Eq, Hash)] pub enum MonitorStatus { Up, Down, From 389f2b886bbbcd0125c29ef2cf7ad365a06d0383 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 12 Jan 2026 14:37:52 -0400 Subject: [PATCH 44/64] Small optimizations --- src/ui/components/monitor_list.rs | 50 +++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index d74b87d..b3a25c2 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -18,8 +18,7 @@ use ratatui::{ const STATUS_LINE_LENGTH: usize = 100; const MAX_NAME_LENGTH: usize = 30; - -static STATUS_CHARS: OnceLock>> = OnceLock::new(); +static STATUS_SPANS: OnceLock>> = OnceLock::new(); pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut DashboardViewState) { let available_height = area.height as usize; @@ -150,17 +149,6 @@ fn render_monitor_table( frame.render_widget(table, area); } -fn get_status_char(status: &MonitorStatus) -> Cow<'static, str> { - let map = STATUS_CHARS.get_or_init(|| { - let mut m = HashMap::new(); - m.insert(MonitorStatus::Up, Cow::Borrowed("■")); - m.insert(MonitorStatus::Down, Cow::Borrowed("■")); - m.insert(MonitorStatus::Unknown, Cow::Borrowed("■")); - m - }); - map.get(status).cloned().unwrap_or(Cow::Borrowed("?")) -} - pub fn get_status_color(status: &MonitorStatus) -> Color { match status { MonitorStatus::Up => Color::Green, @@ -170,8 +158,8 @@ pub fn get_status_color(status: &MonitorStatus) -> Color { } pub fn get_status_emoji(status: &MonitorStatus) -> Cow<'static, str> { - static UP_ICON: &str ="✅"; - static DOWN_ICON: &str ="❌"; + static UP_ICON: &str = "✅"; + static DOWN_ICON: &str = "❌"; static UNKNOWN_ICON: &str = "❓"; match status { MonitorStatus::Up => Cow::Borrowed(UP_ICON), @@ -217,21 +205,33 @@ fn get_formated_line(text: String, color: Color, modifier: Modifier) -> Line<'st )]) } +fn get_cached_status_span(status: &MonitorStatus) -> Span<'static> { + let cache = STATUS_SPANS.get_or_init(|| { + let mut m = HashMap::new(); + m.insert( + MonitorStatus::Up, + Span::styled("■", Style::default().fg(Color::Green)), + ); + m.insert( + MonitorStatus::Down, + Span::styled("■", Style::default().fg(Color::Red)), + ); + m.insert( + MonitorStatus::Unknown, + Span::styled("■", Style::default().fg(Color::Yellow)), + ); + m + }); + cache.get(status).cloned().unwrap_or_default() +} + fn create_status_line_spans(status_history: &[MonitorStatus]) -> Line<'_> { - let recent_status: Vec<_> = status_history + let spans: Vec<_> = status_history .iter() .rev() .take(STATUS_LINE_LENGTH) + .map(|status| get_cached_status_span(status)) .collect(); - - let mut spans = Vec::with_capacity(recent_status.len()); - - for status in recent_status.iter().rev() { - let c = get_status_char(status); - let color = get_status_color(status); - - spans.push(Span::styled(c.to_string(), Style::default().fg(color))); - } Line::from(spans) } From 512f597a0f16e5d032fdf419936757c96fa49b4a Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 12 Jan 2026 16:38:06 -0400 Subject: [PATCH 45/64] Fix --- src/ui/components/monitor_list.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index b3a25c2..af74637 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -104,12 +104,12 @@ fn render_monitor_table( ) { let max_items = area.height as usize; let items_to_show = min(monitors.len(), max_items); - let index = monitors.len().saturating_sub(max_items.saturating_sub(2)); // 2 = Table header + botton - let monitors = if is_first_half { - &monitors[index..].to_vec() + let index = if is_first_half { + monitors.len().saturating_sub(max_items.saturating_sub(2)) // 2 = Table header + botton } else { - monitors + 0 }; + let monitors = &monitors[index..index + items_to_show.min(monitors.len() - index)]; let header_cells = vec![ "".to_string(), From 70a70af859a0e383c4901482fe210574266ee6f9 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 15 Jan 2026 08:23:20 -0400 Subject: [PATCH 46/64] Refactor cache --- src/ui/components/monitor_list.rs | 66 ++++++++++++++++++++++++------- 1 file changed, 51 insertions(+), 15 deletions(-) diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index af74637..34ee859 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -1,7 +1,10 @@ -use std::borrow::Cow; -use std::cmp::min; -use std::collections::HashMap; -use std::sync::OnceLock; +use std::{ + borrow::Cow, + cmp::min, + collections::{HashMap, hash_map::DefaultHasher}, + hash::{Hash, Hasher}, + sync::{OnceLock, RwLock}, +}; use crate::i18n::t; use crate::ui::dashboard::{ @@ -19,6 +22,7 @@ use ratatui::{ const STATUS_LINE_LENGTH: usize = 100; const MAX_NAME_LENGTH: usize = 30; static STATUS_SPANS: OnceLock>> = OnceLock::new(); +static STATUS_LINE_CACHE: OnceLock>>>> = OnceLock::new(); pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut DashboardViewState) { let available_height = area.height as usize; @@ -185,7 +189,7 @@ fn create_monitor_item(monitor: &MonitorViewState) -> Row<'_> { let response_text = format!("{:>7}ms", monitor.response_time); let uptime_text = format!("{:>7}%", monitor.uptime_24h); - let status_line_spans = create_status_line_spans(&monitor.status_history); + let status_line_spans = get_cached_status_line(&monitor.status_history); Row::new(vec![ get_formated_line(format!("{} ", status_icon), status_color, Modifier::empty()), @@ -225,18 +229,50 @@ fn get_cached_status_span(status: &MonitorStatus) -> Span<'static> { cache.get(status).cloned().unwrap_or_default() } -fn create_status_line_spans(status_history: &[MonitorStatus]) -> Line<'_> { - let spans: Vec<_> = status_history - .iter() - .rev() - .take(STATUS_LINE_LENGTH) - .map(|status| get_cached_status_span(status)) - .collect(); - Line::from(spans) -} - fn title_style() -> Style { Style::default() .fg(Color::Yellow) .add_modifier(Modifier::BOLD) } + +fn calculate_history_hash(status_history: &[MonitorStatus]) -> u64 { + let mut hasher = DefaultHasher::new(); + status_history + .iter() + .take(STATUS_LINE_LENGTH) + .for_each(|status| { + status.hash(&mut hasher); + }); + hasher.finish() +} + +fn get_cached_status_line(status_history: &[MonitorStatus]) -> Line<'static> { + let hash = calculate_history_hash(status_history); + let cache = STATUS_LINE_CACHE.get_or_init(|| RwLock::new(HashMap::new())); + { + let read = cache.read().unwrap(); + if let Some(spans) = read.get(&hash) { + return Line::from(spans.clone()); + } + } + + let spans: Vec> = status_history + .iter() + .rev() + .take(STATUS_LINE_LENGTH) + .map(|status| get_cached_status_span(status)) + .collect(); + + let mut write = cache.write().unwrap(); + if write.len() > 1000 { + + let keys_to_remove: Vec<_> = write.keys().take(250).copied().collect(); + + for key in keys_to_remove { + write.remove(&key); + } + + } + write.insert(hash, spans.clone()); + Line::from(spans) +} From 00cb8f7a9b7cf7a9933cdc7374b5d07a94925997 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Sun, 18 Jan 2026 15:43:40 -0400 Subject: [PATCH 47/64] Refactor --- src/core/data.rs | 31 +++++++++++++++++++------------ src/core/models.rs | 24 +++++++++++++----------- src/ui/components/monitor_list.rs | 2 +- src/ui/dashboard/model.rs | 11 ++++++++--- 4 files changed, 41 insertions(+), 27 deletions(-) diff --git a/src/core/data.rs b/src/core/data.rs index bf43969..44fbd17 100644 --- a/src/core/data.rs +++ b/src/core/data.rs @@ -1,3 +1,4 @@ +use std::borrow::Cow; use std::collections::HashMap; use crate::core::models::{UnifiedData, UnifiedGroupData, UnifiedMonitorData}; @@ -6,32 +7,38 @@ use crate::data::{ status_page::model::StatusPageResponse, }; -pub fn unify_data(status_page: &StatusPageResponse, heartbeat: &HeartbeatResponse) -> UnifiedData { +pub fn unify_data<'a>(status_page: &'a StatusPageResponse, heartbeat: &'a HeartbeatResponse) -> UnifiedData<'a> { let mut groups = Vec::with_capacity(status_page.public_group_list.len()); - let heartbeat_map: HashMap> = heartbeat + let heartbeat_map: HashMap = heartbeat .monitors .iter() - .map(|m| (m.monitor_id, m.heartbeats.clone())) + .map(|m| (m.monitor_id, &m.heartbeats[..])) .collect(); - let uptime_map: HashMap<(u64, u32), UptimeData> = heartbeat + let uptime_map: HashMap<(u64, u32), &'a UptimeData> = heartbeat .uptime_data .iter() - .map(|u| ((u.monitor_id, u.period_hours), u.clone())) + .map(|u| ((u.monitor_id, u.period_hours), u)) .collect(); for group in &status_page.public_group_list { let mut monitors = Vec::with_capacity(group.monitor_list.len()); for monitor_info in &group.monitor_list { - let uptime_data = uptime_map.get(&(monitor_info.id, 24)).cloned(); + let uptime_data = uptime_map.get(&(monitor_info.id, 24)).copied(); let heartbeats = heartbeat_map .get(&monitor_info.id) - .cloned() - .unwrap_or_default(); + .copied() + .unwrap_or(&[]); + + let name: Cow<'a, str> = if monitor_info.name.len() > 100 { + Cow::Owned(monitor_info.name.clone()) + } else { + Cow::Borrowed(monitor_info.name.as_str()) + }; monitors.push(UnifiedMonitorData { id: monitor_info.id, - name: monitor_info.name.clone(), + name, heartbeats, uptime_data, }); @@ -40,7 +47,7 @@ pub fn unify_data(status_page: &StatusPageResponse, heartbeat: &HeartbeatRespons monitors.sort_by_key(|m| m.id); groups.push(UnifiedGroupData { - group_info: group.clone(), + group_info: group, monitors, }); } @@ -48,8 +55,8 @@ pub fn unify_data(status_page: &StatusPageResponse, heartbeat: &HeartbeatRespons groups.sort_by_key(|g| g.group_info.weight); UnifiedData { - title: status_page.config.title.clone(), - description: status_page.config.description.clone(), + title: Cow::Borrowed(&status_page.config.title), + description: status_page.config.description.as_deref().map(Cow::Borrowed), groups, auto_refresh_interval: status_page.config.auto_refresh_interval, } diff --git a/src/core/models.rs b/src/core/models.rs index d3851a4..441f2dc 100644 --- a/src/core/models.rs +++ b/src/core/models.rs @@ -1,24 +1,26 @@ +use std::borrow::Cow; + use crate::data::heartbeat::model::{HeartbeatEntry, UptimeData}; use crate::data::status_page::model::{StatusPageGroup}; #[derive(Debug, Clone)] -pub struct UnifiedMonitorData { +pub struct UnifiedMonitorData<'a> { pub id: u64, - pub name: String, - pub heartbeats: Vec, - pub uptime_data: Option, + pub name: Cow<'a, str>, + pub heartbeats: &'a [HeartbeatEntry], + pub uptime_data: Option<&'a UptimeData>, } #[derive(Debug, Clone)] -pub struct UnifiedData { - pub title: String, - pub description: Option, +pub struct UnifiedData<'a> { + pub title: Cow<'a, str>, + pub description: Option>, pub auto_refresh_interval: u32, - pub groups: Vec, + pub groups: Vec>, } #[derive(Debug, Clone)] -pub struct UnifiedGroupData { - pub group_info: StatusPageGroup, - pub monitors: Vec, +pub struct UnifiedGroupData<'a> { + pub group_info: &'a StatusPageGroup, + pub monitors: Vec>, } diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index 34ee859..f178a1c 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -75,7 +75,7 @@ fn render_group(frame: &mut Frame, area: Rect, group: &GroupViewState, is_first_ .constraints([Constraint::Length(1), Constraint::Min(1)]) .split(area); - if chunks[0].height <= 0 || chunks[1].height <= 0 || group.monitors.is_empty() { + if chunks[0].height == 0 || chunks[1].height == 0 || group.monitors.is_empty() { return; } diff --git a/src/ui/dashboard/model.rs b/src/ui/dashboard/model.rs index 6613dc0..fc4cd34 100644 --- a/src/ui/dashboard/model.rs +++ b/src/ui/dashboard/model.rs @@ -70,8 +70,8 @@ impl DashboardViewState { .sum(); Self { - title: data.title, - descriptions: data.description, + title: data.title.into_owned(), + descriptions: data.description.map(|d| d.into_owned()), groups, is_loading: false, error_message: None, @@ -140,8 +140,13 @@ fn add_monitor_view_state(group: UnifiedGroupData) -> Vec { .map(|u| u.get_perc_formated()) .unwrap_or_else(|| t("unknown").to_string()); + let name: Cow<'static, str> = match monitor.name { + Cow::Borrowed(borrowed) => Cow::Owned(borrowed.to_string()), + Cow::Owned(owned) => Cow::Owned(owned) + }; + MonitorViewState { - name: Cow::Owned(monitor.name), + name, status, response_time, uptime_24h, From c48a37d56ac961c0aee601e433af6ec53d10a61c Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 19 Jan 2026 06:28:25 -0400 Subject: [PATCH 48/64] Clippy suggestions --- src/data/heartbeat/model.rs | 6 +++--- src/i18n/translate.rs | 4 ++-- src/ui/app.rs | 28 ++++++++++++++-------------- src/ui/components/monitor_list.rs | 4 ++-- src/ui/dashboard/model.rs | 2 +- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/data/heartbeat/model.rs b/src/data/heartbeat/model.rs index d4ed8cf..042ca91 100644 --- a/src/data/heartbeat/model.rs +++ b/src/data/heartbeat/model.rs @@ -55,7 +55,7 @@ impl HeartbeatResponse { for (monitor_id_str, heartbeats) in &self.heartbeat_list_raw { let monitor_id = monitor_id_str .parse::() - .with_context(|| format!("{}", t("invalid-monitor-id")))?; + .with_context(|| t("invalid-monitor-id").to_string())?; self.monitors.push(MonitorHeartbeats { monitor_id, @@ -77,11 +77,11 @@ impl HeartbeatResponse { let monitor_id = parts[0] .parse::() - .with_context(|| format!("{}", t("invalid-monitor-id")))?; + .with_context(|| t("invalid-monitor-id").to_string())?; let period_hours = parts[1] .parse::() - .with_context(|| format!("{}", t("invalid-period-hours")))?; + .with_context(|| t("invalid-period-hours").to_string())?; self.uptime_data.push(UptimeData { monitor_id, diff --git a/src/i18n/translate.rs b/src/i18n/translate.rs index 660bebd..f9a01fc 100644 --- a/src/i18n/translate.rs +++ b/src/i18n/translate.rs @@ -34,7 +34,7 @@ pub fn t(key: &str) -> String { } } - let result = LOCALES.lookup(&*get_system_locale(), key); + let result = LOCALES.lookup(get_system_locale(), key); let mut cache_write = cache.write().unwrap(); @@ -51,5 +51,5 @@ pub fn t_with_args(key: &str, args: &HashMap<&'static str, String>) -> String { for (key, value) in args { map.insert(Cow::Borrowed(*key), FluentValue::from(value)); } - LOCALES.lookup_with_args(&get_system_locale(), key, &map) + LOCALES.lookup_with_args(get_system_locale(), key, &map) } diff --git a/src/ui/app.rs b/src/ui/app.rs index 9791d8b..f9ab49f 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -159,7 +159,7 @@ impl App { let seconds_until_update = self .update_interval .checked_sub(self.last_update.elapsed()) - .map(|d| d.as_secs() as u64) + .map(|d| d.as_secs()) .unwrap_or(30); render_footer(frame, chunks[2], seconds_until_update); @@ -198,20 +198,20 @@ impl App { fn handle_events(&mut self) -> io::Result<()> { let timeout = Duration::from_secs(1); - if event::poll(timeout)? { - if let Event::Key(key) = event::read()? { - if key.kind == KeyEventKind::Release { - return Ok(()); - } + if event::poll(timeout)? + && let Event::Key(key) = event::read()? + { + if key.kind == KeyEventKind::Release { + return Ok(()); + } - match key.code { - KeyCode::Char('q') | KeyCode::Esc => self.should_quit = true, - KeyCode::Up | KeyCode::Char('k') => self.state.scroll_state.prev(), - KeyCode::Down | KeyCode::Char('j') => self.state.scroll_state.next(), - KeyCode::Home => self.state.scroll_state.first(), - KeyCode::End => self.state.scroll_state.last(), - _ => {} - } + match key.code { + KeyCode::Char('q') | KeyCode::Esc => self.should_quit = true, + KeyCode::Up | KeyCode::Char('k') => self.state.scroll_state.prev(), + KeyCode::Down | KeyCode::Char('j') => self.state.scroll_state.next(), + KeyCode::Home => self.state.scroll_state.first(), + KeyCode::End => self.state.scroll_state.last(), + _ => {} } } Ok(()) diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index f178a1c..96baf77 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -38,7 +38,7 @@ pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut Dashb let mut lines_skipped = 0; let half = state.get_total_lenght().saturating_div(2); - for (_i, group) in state.groups.iter().enumerate() { + for group in state.groups.iter() { let group_height = group.monitors.len() + BORDER_LINES_VIEW; if lines_skipped + group_height <= scroll_pos { @@ -103,7 +103,7 @@ fn render_group(frame: &mut Frame, area: Rect, group: &GroupViewState, is_first_ fn render_monitor_table( frame: &mut Frame, area: Rect, - monitors: &Vec, + monitors: &[MonitorViewState], is_first_half: bool, ) { let max_items = area.height as usize; diff --git a/src/ui/dashboard/model.rs b/src/ui/dashboard/model.rs index fc4cd34..24dfe1f 100644 --- a/src/ui/dashboard/model.rs +++ b/src/ui/dashboard/model.rs @@ -120,7 +120,7 @@ fn add_monitor_view_state(group: UnifiedGroupData) -> Vec { .monitors .into_par_iter() .map(|monitor| { - let status_history = get_status_history(&monitor.heartbeats); + let status_history = get_status_history(monitor.heartbeats); let status = match monitor.heartbeats.last().map(|h| h.status) { Some(1) => MonitorStatus::Up, From d63c701867a6146fc2970fa134f67c1215d0b5c5 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 19 Jan 2026 10:31:18 -0400 Subject: [PATCH 49/64] Update dependencies --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9e0c1a1..8002565 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -236,9 +236,9 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.42" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ "iana-time-zone", "js-sys", diff --git a/Cargo.toml b/Cargo.toml index d25d063..1610b56 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,7 +20,7 @@ once_cell = "1.19" url = "2.5.8" ratatui = "0.30.0" crossterm = "0.29.0" -chrono = "0.4.42" +chrono = "0.4.43" rayon = "1.11.0" rustls = { version = "0.23.36", default-features = false, features = ["ring"] } From 975c4b1eafaf8f76ac07eb258ffed8d073f51a1c Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 19 Jan 2026 13:34:37 -0400 Subject: [PATCH 50/64] Span optimizations --- src/ui/components/monitor_list.rs | 58 +++++++++++++++---------------- 1 file changed, 28 insertions(+), 30 deletions(-) diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index 96baf77..24f6081 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -6,11 +6,14 @@ use std::{ sync::{OnceLock, RwLock}, }; -use crate::i18n::t; -use crate::ui::dashboard::{ - MonitorStatus, MonitorViewState, - model::{BORDER_LINES_VIEW, DashboardViewState, GroupViewState}, +use crate::{ + i18n::t, + ui::dashboard::{ + MonitorStatus, MonitorViewState, + model::{BORDER_LINES_VIEW, DashboardViewState, GroupViewState}, + }, }; +use once_cell::sync::Lazy; use ratatui::{ Frame, layout::{Alignment, Constraint, Direction, Layout, Rect}, @@ -21,8 +24,17 @@ use ratatui::{ const STATUS_LINE_LENGTH: usize = 100; const MAX_NAME_LENGTH: usize = 30; -static STATUS_SPANS: OnceLock>> = OnceLock::new(); -static STATUS_LINE_CACHE: OnceLock>>>> = OnceLock::new(); + +static UP_SPAN: Lazy> = + Lazy::new(|| Span::styled("■", Style::default().fg(Color::Green))); + +static DOWN_SPAN: Lazy> = + Lazy::new(|| Span::styled("■", Style::default().fg(Color::Red))); + +static UNKNOWN_SPAN: Lazy> = + Lazy::new(|| Span::styled("■", Style::default().fg(Color::Yellow))); + +static STATUS_LINE_CACHE: OnceLock>>>> = OnceLock::new(); pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut DashboardViewState) { let available_height = area.height as usize; @@ -209,24 +221,12 @@ fn get_formated_line(text: String, color: Color, modifier: Modifier) -> Line<'st )]) } -fn get_cached_status_span(status: &MonitorStatus) -> Span<'static> { - let cache = STATUS_SPANS.get_or_init(|| { - let mut m = HashMap::new(); - m.insert( - MonitorStatus::Up, - Span::styled("■", Style::default().fg(Color::Green)), - ); - m.insert( - MonitorStatus::Down, - Span::styled("■", Style::default().fg(Color::Red)), - ); - m.insert( - MonitorStatus::Unknown, - Span::styled("■", Style::default().fg(Color::Yellow)), - ); - m - }); - cache.get(status).cloned().unwrap_or_default() +fn get_status_span(status: &MonitorStatus) -> &'static Span<'static> { + match status { + MonitorStatus::Up => &UP_SPAN, + MonitorStatus::Down => &DOWN_SPAN, + MonitorStatus::Unknown => &UNKNOWN_SPAN, + } } fn title_style() -> Style { @@ -252,27 +252,25 @@ fn get_cached_status_line(status_history: &[MonitorStatus]) -> Line<'static> { { let read = cache.read().unwrap(); if let Some(spans) = read.get(&hash) { - return Line::from(spans.clone()); + return Line::from(spans.iter().map(|&span| span.clone()).collect::>()); } } - let spans: Vec> = status_history + let spans: Vec<&'static Span<'static>> = status_history .iter() .rev() .take(STATUS_LINE_LENGTH) - .map(|status| get_cached_status_span(status)) + .map(|status| get_status_span(status)) .collect(); let mut write = cache.write().unwrap(); if write.len() > 1000 { - let keys_to_remove: Vec<_> = write.keys().take(250).copied().collect(); for key in keys_to_remove { write.remove(&key); } - } write.insert(hash, spans.clone()); - Line::from(spans) + Line::from(spans.iter().map(|&span| span.clone()).collect::>()) } From 64f5115d54ce9490516ac374e48eb3199b9e6c9e Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Mon, 19 Jan 2026 16:04:45 -0400 Subject: [PATCH 51/64] Line optimizations --- src/ui/components/monitor_list.rs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index 24f6081..56a8cfa 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -34,7 +34,7 @@ static DOWN_SPAN: Lazy> = static UNKNOWN_SPAN: Lazy> = Lazy::new(|| Span::styled("■", Style::default().fg(Color::Yellow))); -static STATUS_LINE_CACHE: OnceLock>>>> = OnceLock::new(); +static STATUS_LINE_CACHE: OnceLock>>> = OnceLock::new(); pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut DashboardViewState) { let available_height = area.height as usize; @@ -251,18 +251,19 @@ fn get_cached_status_line(status_history: &[MonitorStatus]) -> Line<'static> { let cache = STATUS_LINE_CACHE.get_or_init(|| RwLock::new(HashMap::new())); { let read = cache.read().unwrap(); - if let Some(spans) = read.get(&hash) { - return Line::from(spans.iter().map(|&span| span.clone()).collect::>()); + if let Some(line) = read.get(&hash) { + return line.clone(); } } - let spans: Vec<&'static Span<'static>> = status_history + let spans: Vec> = status_history .iter() .rev() .take(STATUS_LINE_LENGTH) - .map(|status| get_status_span(status)) + .map(|status| get_status_span(status).clone()) .collect(); + let new_line = Line::from(spans); let mut write = cache.write().unwrap(); if write.len() > 1000 { let keys_to_remove: Vec<_> = write.keys().take(250).copied().collect(); @@ -271,6 +272,6 @@ fn get_cached_status_line(status_history: &[MonitorStatus]) -> Line<'static> { write.remove(&key); } } - write.insert(hash, spans.clone()); - Line::from(spans.iter().map(|&span| span.clone()).collect::>()) + write.insert(hash, new_line.clone()); + new_line } From 99d4b94e5c23369a9f13ebedbb9b8a3251f6292d Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Tue, 20 Jan 2026 16:18:54 -0400 Subject: [PATCH 52/64] optimizations --- src/core/data.rs | 37 ++++++++++++++++++------------- src/data/heartbeat/parser.rs | 4 ++-- src/data/status_page/parser.rs | 4 ++-- src/ui/app.rs | 13 ++++++----- src/ui/components/monitor_list.rs | 26 ++++++++++++---------- src/ui/dashboard/model.rs | 18 ++++++--------- 6 files changed, 54 insertions(+), 48 deletions(-) diff --git a/src/core/data.rs b/src/core/data.rs index 44fbd17..028515d 100644 --- a/src/core/data.rs +++ b/src/core/data.rs @@ -7,28 +7,35 @@ use crate::data::{ status_page::model::StatusPageResponse, }; -pub fn unify_data<'a>(status_page: &'a StatusPageResponse, heartbeat: &'a HeartbeatResponse) -> UnifiedData<'a> { +pub fn unify_data<'a>( + status_page: &'a StatusPageResponse, + heartbeat: &'a HeartbeatResponse, +) -> UnifiedData<'a> { let mut groups = Vec::with_capacity(status_page.public_group_list.len()); - let heartbeat_map: HashMap = heartbeat - .monitors - .iter() - .map(|m| (m.monitor_id, &m.heartbeats[..])) - .collect(); - let uptime_map: HashMap<(u64, u32), &'a UptimeData> = heartbeat - .uptime_data - .iter() - .map(|u| ((u.monitor_id, u.period_hours), u)) - .collect(); + let mut heartbeat_map: HashMap = + HashMap::with_capacity(heartbeat.monitors.len()); + heartbeat_map.extend( + heartbeat + .monitors + .iter() + .map(|m| (m.monitor_id, &m.heartbeats[..])), + ); + + let mut uptime_map: HashMap<(u64, u32), &'a UptimeData> = + HashMap::with_capacity(heartbeat.uptime_data.len()); + uptime_map.extend( + heartbeat + .uptime_data + .iter() + .map(|u| ((u.monitor_id, u.period_hours), u)), + ); for group in &status_page.public_group_list { let mut monitors = Vec::with_capacity(group.monitor_list.len()); for monitor_info in &group.monitor_list { let uptime_data = uptime_map.get(&(monitor_info.id, 24)).copied(); - let heartbeats = heartbeat_map - .get(&monitor_info.id) - .copied() - .unwrap_or(&[]); + let heartbeats = heartbeat_map.get(&monitor_info.id).copied().unwrap_or(&[]); let name: Cow<'a, str> = if monitor_info.name.len() > 100 { Cow::Owned(monitor_info.name.clone()) diff --git a/src/data/heartbeat/parser.rs b/src/data/heartbeat/parser.rs index 3733065..72e4bcd 100644 --- a/src/data/heartbeat/parser.rs +++ b/src/data/heartbeat/parser.rs @@ -3,8 +3,8 @@ use crate::i18n::t; use anyhow::{Context, Ok, Result}; pub fn parse_response(json_text: &str) -> Result { - let mut response: HeartbeatResponse = - serde_json::from_str(json_text).with_context(|| t("invalid-json-heartbeat"))?; + let mut response: HeartbeatResponse = serde_json::from_slice(json_text.as_bytes()) + .with_context(|| t("invalid-json-heartbeat"))?; response.process()?; Ok(response) diff --git a/src/data/status_page/parser.rs b/src/data/status_page/parser.rs index a765c58..b6b8c07 100644 --- a/src/data/status_page/parser.rs +++ b/src/data/status_page/parser.rs @@ -3,7 +3,7 @@ use crate::i18n::t; use anyhow::{Context, Ok, Result}; pub fn parse_response(json_text: &str) -> Result { - let response: StatusPageResponse = - serde_json::from_str(json_text).with_context(|| t("invalid-json-status-page"))?; + let response: StatusPageResponse = serde_json::from_slice(json_text.as_bytes()) + .with_context(|| t("invalid-json-status-page"))?; Ok(response) } diff --git a/src/ui/app.rs b/src/ui/app.rs index f9ab49f..a2abab4 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -30,6 +30,8 @@ use std::{ }; const INITIAL_INTERVAL: u32 = 300; +const MAIN_LAYOUT_WITH_SCROLLBAR: [Constraint; 2] = [Constraint::Min(1), Constraint::Length(1)]; +const MAIN_LAYOUT_WITHOUT_SCROLLBAR: [Constraint; 1] = [Constraint::Min(1)]; enum FetchResult { Heartbeat(Result), @@ -134,12 +136,11 @@ impl App { render_header(frame, chunks[0], &self.state); - let mut main_constraint = Vec::with_capacity(2); - main_constraint.push(Constraint::Min(1)); - - if self.state.show_vertical_scrollbar(chunks[1].height) { - main_constraint.push(Constraint::Length(1)); - } + let main_constraint = if self.state.show_vertical_scrollbar(chunks[1].height) { + &MAIN_LAYOUT_WITH_SCROLLBAR[..] + } else { + &MAIN_LAYOUT_WITHOUT_SCROLLBAR[..] + }; let main_chunks = Layout::default() .direction(Direction::Horizontal) diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index 56a8cfa..1cab664 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -137,11 +137,10 @@ fn render_monitor_table( let header = Row::new(header_cells).style(title_style()).height(1); - let rows: Vec = monitors - .iter() - .take(items_to_show) - .map(|monitor| create_monitor_item(monitor)) - .collect(); + let mut rows: Vec = Vec::with_capacity(items_to_show); + for monitor in monitors.iter().take(items_to_show) { + rows.push(create_monitor_item(monitor)); + } let widths = vec![ Constraint::Length(3), @@ -256,17 +255,20 @@ fn get_cached_status_line(status_history: &[MonitorStatus]) -> Line<'static> { } } - let spans: Vec> = status_history - .iter() - .rev() - .take(STATUS_LINE_LENGTH) - .map(|status| get_status_span(status).clone()) - .collect(); + let mut spans: Vec> = Vec::with_capacity(STATUS_LINE_LENGTH); + spans.extend( + status_history + .iter() + .rev() + .take(STATUS_LINE_LENGTH) + .map(|status| get_status_span(status).clone()), + ); let new_line = Line::from(spans); let mut write = cache.write().unwrap(); if write.len() > 1000 { - let keys_to_remove: Vec<_> = write.keys().take(250).copied().collect(); + let mut keys_to_remove: Vec = Vec::with_capacity(250); + keys_to_remove.extend(write.keys().take(250).copied()); for key in keys_to_remove { write.remove(&key); diff --git a/src/ui/dashboard/model.rs b/src/ui/dashboard/model.rs index 24dfe1f..94e1bf7 100644 --- a/src/ui/dashboard/model.rs +++ b/src/ui/dashboard/model.rs @@ -95,16 +95,12 @@ impl DashboardViewState { } fn get_status_history(heartbeats: &[HeartbeatEntry]) -> Vec { - let mut history = heartbeats - .iter() - .rev() - .take(100) - .map(|h| match h.status { - 0 => MonitorStatus::Down, - 1 => MonitorStatus::Up, - _ => MonitorStatus::Unknown, - }) - .collect::>(); + let mut history: Vec<_> = Vec::with_capacity(heartbeats.len()); + history.extend(heartbeats.iter().rev().take(100).map(|h| match h.status { + 0 => MonitorStatus::Down, + 1 => MonitorStatus::Up, + _ => MonitorStatus::Unknown, + })); while history.len() < 100 { history.push(MonitorStatus::Unknown); @@ -142,7 +138,7 @@ fn add_monitor_view_state(group: UnifiedGroupData) -> Vec { let name: Cow<'static, str> = match monitor.name { Cow::Borrowed(borrowed) => Cow::Owned(borrowed.to_string()), - Cow::Owned(owned) => Cow::Owned(owned) + Cow::Owned(owned) => Cow::Owned(owned), }; MonitorViewState { From d8b484341507a1980bd078712dee0a1cd9e0cf53 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Tue, 20 Jan 2026 16:54:36 -0400 Subject: [PATCH 53/64] optimizations --- src/ui/dashboard/model.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/src/ui/dashboard/model.rs b/src/ui/dashboard/model.rs index 94e1bf7..a59595a 100644 --- a/src/ui/dashboard/model.rs +++ b/src/ui/dashboard/model.rs @@ -124,17 +124,15 @@ fn add_monitor_view_state(group: UnifiedGroupData) -> Vec { _ => MonitorStatus::Unknown, }; - let response_time = monitor - .heartbeats - .last() - .and_then(|h| h.ping) - .map(|ms| format!("{}", ms)) - .unwrap_or_else(|| t("unknown").to_string() + " "); + let response_time = match monitor.heartbeats.last().and_then(|h| h.ping) { + Some(ms) => format!("{}", ms), + None => t("unknown"), + }; - let uptime_24h = monitor - .uptime_data - .map(|u| u.get_perc_formated()) - .unwrap_or_else(|| t("unknown").to_string()); + let uptime_24h = match monitor.uptime_data.map(|u| u.get_perc_formated()) { + Some(perc) => perc, + None => t("unknown"), + }; let name: Cow<'static, str> = match monitor.name { Cow::Borrowed(borrowed) => Cow::Owned(borrowed.to_string()), From 17662107b07e31b7c23d5a8bca9bb8af5aecc728 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Wed, 21 Jan 2026 12:34:50 -0400 Subject: [PATCH 54/64] Refactoring --- src/api/client.rs | 7 ++-- src/ui/app.rs | 81 ++++++++++++++--------------------------------- 2 files changed, 28 insertions(+), 60 deletions(-) diff --git a/src/api/client.rs b/src/api/client.rs index eb3032f..6dc4448 100644 --- a/src/api/client.rs +++ b/src/api/client.rs @@ -1,9 +1,11 @@ +use std::time::Duration; + use anyhow::Result; use reqwest::blocking::Client; use crate::{ api::endpoints::UptimeKumaEndpoints, - data::{self, heartbeat::HeartbeatResponse, status_page::model::StatusPageResponse}, + data::{self, heartbeat::HeartbeatResponse, status_page::model::StatusPageResponse}, i18n::t, }; #[derive(Debug, Clone)] @@ -13,8 +15,9 @@ pub struct UptimeKumaClient { impl UptimeKumaClient { pub fn new() -> Self { + let client = Client::builder().connect_timeout(Duration::from_secs(10)).timeout(Duration::from_secs(30)).build().unwrap_or_else(|_| panic!("{}", t("http-build-error"))); Self { - client: Client::new(), + client, } } diff --git a/src/ui/app.rs b/src/ui/app.rs index a2abab4..0dc9c9c 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -1,12 +1,10 @@ use crate::api::{UptimeKumaClient, UptimeKumaEndpoints}; use crate::core; -use crate::data::{heartbeat::HeartbeatResponse, status_page::model::StatusPageResponse}; use crate::i18n::{t, t_with_args}; use crate::ui::{ components::{render_footer, render_header, render_monitor_list}, dashboard::model::DashboardViewState, }; -use anyhow::Result; use crossterm::{ event::{self, DisableMouseCapture, EnableMouseCapture, Event, KeyCode, KeyEventKind}, execute, @@ -24,8 +22,6 @@ use ratatui::{ use std::{ collections::HashMap, io, - sync::mpsc, - thread, time::{Duration, Instant}, }; @@ -33,11 +29,6 @@ const INITIAL_INTERVAL: u32 = 300; const MAIN_LAYOUT_WITH_SCROLLBAR: [Constraint; 2] = [Constraint::Min(1), Constraint::Length(1)]; const MAIN_LAYOUT_WITHOUT_SCROLLBAR: [Constraint; 1] = [Constraint::Min(1)]; -enum FetchResult { - Heartbeat(Result), - StatusPage(Result), -} - pub struct App { state: DashboardViewState, terminal: Terminal>, @@ -49,6 +40,26 @@ pub struct App { } impl App { + pub fn new(endpoints: UptimeKumaEndpoints) -> io::Result { + let backend = CrosstermBackend::new(io::stdout()); + let mut terminal = Terminal::new(backend)?; + terminal.hide_cursor()?; + + let state = DashboardViewState::new(); + + let initial_interval = Duration::from_secs(INITIAL_INTERVAL as u64); + + Ok(Self { + state, + terminal, + should_quit: false, + last_update: Instant::now(), + update_interval: initial_interval, + endpoints, + client: UptimeKumaClient::new(), + }) + } + fn setup_terminal(&mut self) -> io::Result<()> { enable_raw_mode()?; execute!(io::stdout(), EnterAlternateScreen, EnableMouseCapture)?; @@ -248,57 +259,11 @@ impl App { Ok(()) } - pub fn new(endpoints: UptimeKumaEndpoints) -> io::Result { - let backend = CrosstermBackend::new(io::stdout()); - let mut terminal = Terminal::new(backend)?; - terminal.hide_cursor()?; - - let state = DashboardViewState::new(); - - let initial_interval = Duration::from_secs(INITIAL_INTERVAL as u64); - - Ok(Self { - state, - terminal, - should_quit: false, - last_update: Instant::now(), - update_interval: initial_interval, - endpoints, - client: UptimeKumaClient::new(), - }) - } - fn fetch_and_update_data(&mut self) -> anyhow::Result<()> { - let (tx, rx) = mpsc::channel(); + let heartbeat_result = self.client.fetch_heartbeat(&self.endpoints)?; + let status_page_result = self.client.fetch_status_page(&self.endpoints)?; - let heartbeat_client = self.client.clone(); - let heartbeat_endpoints = self.endpoints.clone(); - let tx_clone = tx.clone(); - thread::spawn(move || { - let result = heartbeat_client.fetch_heartbeat(&heartbeat_endpoints); - tx.send(FetchResult::Heartbeat(result)).unwrap(); - }); - - let status_page_client = self.client.clone(); - let status_page_endpoints = self.endpoints.clone(); - - thread::spawn(move || { - let result = status_page_client.fetch_status_page(&status_page_endpoints); - tx_clone.send(FetchResult::StatusPage(result)).unwrap(); - }); - - let mut heartbeat_result = None; - let mut status_page_result = None; - - for _ in 0..2 { - match rx.recv()? { - FetchResult::Heartbeat(result) => heartbeat_result = Some(result?), - FetchResult::StatusPage(result) => status_page_result = Some(result?), - } - } - let heartbeat_data = heartbeat_result.unwrap(); - let status_page_data = status_page_result.unwrap(); - let unified_data = core::unify_data(&status_page_data, &heartbeat_data); + let unified_data = core::unify_data(&status_page_result, &heartbeat_result); self.state = DashboardViewState::from_unified_data(unified_data); Ok(()) } From c5f272b70e4faba16ee60dae4bcee20a9ce2f484 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 22 Jan 2026 09:46:38 -0400 Subject: [PATCH 55/64] Added README and production release workflow --- .forgejo/workflows/release.yaml | 179 ++++++++++++++++++++++++++++++++ README.md | 132 +++++++++++++++++++++++ 2 files changed, 311 insertions(+) create mode 100644 .forgejo/workflows/release.yaml create mode 100644 README.md diff --git a/.forgejo/workflows/release.yaml b/.forgejo/workflows/release.yaml new file mode 100644 index 0000000..e62f186 --- /dev/null +++ b/.forgejo/workflows/release.yaml @@ -0,0 +1,179 @@ +name: Multi-Platform Release Build +on: + push: + tags: + - "v*.*.*" +jobs: + build: + runs-on: docker + strategy: + fail-fast: false + matrix: + include: + - target: native + cross: false + platform: linux/arm64 + + - target: x86_64-unknown-linux-gnu + cross: true + platform: linux/amd64 + deps: "build-essential gcc-x86-64-linux-gnu libc6-dev-amd64-cross pkg-config binutils-x86-64-linux-gnu" + env: + CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER: x86_64-linux-gnu-gcc + + - target: x86_64-pc-windows-gnu + cross: true + platform: linux/amd64 + deps: "gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 cmake nasm" + env: + CC_x86_64_pc_windows_gnu: x86_64-w64-mingw32-gcc + CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER: x86_64-w64-mingw32-gcc + + steps: + - name: Checkout code + uses: https://code.forgejo.org/actions/checkout@v4 + + - name: Setup Rust + uses: https://github.com/dtolnay/rust-toolchain@stable + with: + toolchain: stable + + - name: Cache Rust dependencies + uses: https://code.forgejo.org/actions/cache@v4 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ matrix.target }}-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-${{ matrix.target }}- + ${{ runner.os }}-cargo- + + - name: Native Build Release + if: matrix.target == 'native' + run: | + NATIVE_TARGET=$(rustc -vV | grep 'host:' | cut -d' ' -f2) + echo "Building for native target: $NATIVE_TARGET" + cargo build --release + TARGET_BINARY="target/release/uptime-kuma-dashboard" + OUTPUT_NAME="uptime-kuma-dashboard-$NATIVE_TARGET" + mkdir -p release-artifacts + cp "$TARGET_BINARY" "release-artifacts/$OUTPUT_NAME" + strip "release-artifacts/$OUTPUT_NAME" 2>/dev/null || true + chmod +x "release-artifacts/$OUTPUT_NAME" + ls -lh "release-artifacts/$OUTPUT_NAME" + + - name: Get Rust version + id: rust-version + run: echo "version=$(rustc --version | cut -d' ' -f2)" >> $GITHUB_OUTPUT + + - name: Cross-Build Linux x86_64 Release + if: matrix.target == 'x86_64-unknown-linux-gnu' + uses: docker://rust:slim + with: + args: > + sh -c " + rustup target add ${{ matrix.target }} && + apt-get update && apt-get install -y ${{ matrix.deps }} && + mkdir -p ~/.cargo && + echo '[target.${{ matrix.target }}]\nlinker = \"x86_64-linux-gnu-gcc\"' > ~/.cargo/config.toml && + cargo build --release --target ${{ matrix.target }} && + mkdir -p release-artifacts && + cp target/${{ matrix.target }}/release/uptime-kuma-dashboard release-artifacts/uptime-kuma-dashboard-${{ matrix.target }} && + x86_64-linux-gnu-strip release-artifacts/uptime-kuma-dashboard-${{ matrix.target }} && + chmod +x release-artifacts/uptime-kuma-dashboard-${{ matrix.target }}" + env: ${{ matrix.env }} + options: --platform ${{ matrix.platform }} + + - name: Cross-Build Windows x86_64 Release + if: matrix.target == 'x86_64-pc-windows-gnu' + uses: docker://rust:slim + with: + args: > + sh -c " + rustup target add ${{ matrix.target }} && + apt-get update && apt-get install -y ${{ matrix.deps }} && + cargo build --release --target ${{ matrix.target }} && + mkdir -p release-artifacts && + cp target/${{ matrix.target }}/release/uptime-kuma-dashboard.exe release-artifacts/uptime-kuma-dashboard-${{ matrix.target }}.exe && + ls -lh release-artifacts/" + env: ${{ matrix.env }} + options: --platform ${{ matrix.platform }} + + - name: Upload artifacts + uses: https://data.forgejo.org/forgejo/upload-artifact@v4 + with: + name: binary-${{ matrix.target }} + path: release-artifacts/ + retention-days: 1 + + create-release: + runs-on: docker + needs: build + permissions: + contents: write + steps: + - name: Checkout code + uses: https://code.forgejo.org/actions/checkout@v4 + + - name: Download all artifacts + uses: https://data.forgejo.org/forgejo/download-artifact@v4 + with: + path: all-artifacts/ + + - name: Prepare release artifacts + run: | + mkdir -p release-artifacts + find all-artifacts -type f -name "uptime-kuma-dashboard-*" -exec cp {} release-artifacts/ \; + ls -lh release-artifacts/ + + - name: Generate checksums + run: | + cd release-artifacts + sha256sum uptime-kuma-dashboard-* > SHA256SUMS.txt + cat SHA256SUMS.txt + + - name: Create Release + uses: https://code.forgejo.org/actions/forgejo-release@v2 + with: + direction: upload + url: https://git.marcodearaujo.com + repo: marcodearaujo/uptime-kuma-dashboard + token: ${{ secrets.FORGEJO_TOKEN }} + release-dir: release-artifacts + title: "Release ${{ forgejo.ref_name }}" + tag: ${{ forgejo.ref_name }} + release-notes: | + ## 🚀 Multi-Platform Release + Compiled on Forgejo Runner **${{ runner.arch }}** + + ### 📦 Available Binaries + This release includes binaries for the following platforms: + - **Linux x86_64** (Intel/AMD 64-bit) + - **Linux ARM64** (aarch64) - Raspberry Pi 4, ARM servers + - **Windows x86_64** (64-bit) + + ### 🚀 How to use + #### Linux/ARM: + # Download the appropriate binary + wget https://your-forgejo.com/releases/download/${{ forgejo.ref_name }}/uptime-kuma-dashboard- + # Make executable + chmod +x uptime-kuma-dashboard-* + # Run + ./uptime-kuma-dashboard-* --base-url https://your-kuma --slug your-slug + + #### Windows: + # Download uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe + # Run in PowerShell or CMD + .\uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe --base-url https://your-kuma --slug your-slug + + ### ✅ Verify Checksums + sha256sum -c SHA256SUMS.txt + + ### 🏗️ Build Information + - Rust Version: ${{ steps.rust-version.outputs.version }} + - Build Date: $(date +'%Y-%m-%d') + - Build Type: Release (optimized with LTO) diff --git a/README.md b/README.md new file mode 100644 index 0000000..63907b2 --- /dev/null +++ b/README.md @@ -0,0 +1,132 @@ +# Uptime Kuma Terminal Dashboard + +![Terminal Dashboard Preview](https://img.shields.io/badge/Rust-1.76+-orange?style=flat-square&logo=rust) + +A terminal-based monitoring dashboard for Uptime Kuma that displays service status, uptime percentages, and historical performance data directly in your terminal. Built with Rust for performance and reliability. + +## Overview + +This personal project started as a way to monitor my home lab services without needing a web browser. It connects to your Uptime Kuma instance API and presents a clean, color-coded view of your services' status with real-time updates. The dashboard works great on servers, remote terminals, or anywhere you prefer a lightweight monitoring solution. + +Perfect for DevOps engineers, system administrators, or anyone who prefers terminal workflows over web interfaces for quick status checks. + +## Features + +- Real-time service monitoring with automatic refresh +- Color-coded status indicators (green for up, red for down) +- Historical uptime visualization with compact status history lines +- Responsive terminal UI that adapts to window size +- Internationalization support (English and Portuguese) +- Configurable refresh intervals +- Minimal resource usage (runs efficiently even on low-power devices) +- Keyboard navigation support (arrow keys, home/end) +- Mobile-friendly design for SSH connections + +## Tech Stack + +This project demonstrates proficiency with several modern technologies: + +- **Rust** (core language with async capabilities) +- **ratatui** (terminal UI framework) +- **reqwest** (HTTP client for API communication) +- **serde** (JSON serialization/deserialization) +- **clap** (command-line argument parsing) +- **fluent-templates** (internationalization framework) +- REST API integration patterns +- Error handling and logging best practices +- Cross-platform terminal development + +You can find the latest releases in the [Releases section](https://git.marcodearaujo.com/marcodearaujo/uptime-kuma-dashboard/releases). + +## Installation + +### Option 1: Download built Binary (Recommended) +1. Go to the [Releases page](https://git.marcodearaujo.com/marcodearaujo/uptime-kuma-dashboard/releases) +2. Download the binary for your operating system +3. Make it executable: `chmod +x uptime-kuma-dashboard` +4. Run it with your Uptime Kuma URL and slug + +### Option 2: Build From Source + +### Prerequisites + +- Rust 1.74+ toolchain (install via [rustup](https://rustup.rs/)) +- Uptime Kuma instance with API access + +### Build from Source + +```bash +# Clone the repository +git clone https://git.marcodearaujo.com/marcodearaujo/uptime-kuma-dashboard.git +cd uptime-kuma-dashboard + +# Build the project +cargo build --release + +# Run the dashboard (replace with your Uptime Kuma URL and status page slug) +./target/release/uptime-kuma-dashboard \ + --base-url="http://your-uptime-kuma-instance:3001/" \ + --slug="your-status-page-slug" +``` + +## Usage + +The dashboard requires two parameters: + +- `--base-url`: Your Uptime Kuma instance URL (including port) +- `--slug`: Your status page slug identifier + +Example: +```bash +./uptime-kuma-dashboard --base-url="http://192.168.1.100:3001/" --slug="home-services" +``` + +**Controls during runtime:** +- `q` or `ESC`: Exit the dashboard +- `↑`/`↓` or `k`/`j`: Navigate through monitors +- `Home`/`End`: Jump to top/bottom of the list + +## Configuration + +You can set environment variables to avoid typing parameters each time: + +```bash +export UPTIME_KUMA_URL="http://your-uptime-kuma-instance:3001/" +export STATUS_PAGE_SLUG="your-status-page-slug" +``` + +## Development Notes + +This project follows Rust best practices including: +- Comprehensive error handling with `anyhow` +- Internationalization-ready architecture +- Modular code organization +- Performance optimization for terminal rendering +- Cross-platform compatibility testing + +The architecture separates concerns into: +- API client layer +- Data processing core +- UI rendering components +- Configuration management +- Internationalization system + +## Contribution + +While this is primarily a personal project, I welcome suggestions and improvements! If you have ideas for new features or bug fixes: + +1. Fork the repository +2. Create a feature branch (`git checkout -b feature/amazing-feature`) +3. Commit your changes (`git commit -m 'Add some amazing feature'`) +4. Push to the branch (`git push origin feature/amazing-feature`) +5. Open a pull request + +Please note this is a side project, so response times may vary. + +## License + +This project is available under the MIT License - see the [LICENSE](LICENSE) file for details. + +--- + +*Developed as a personal learning project to improve Rust skills and create a useful tool for my home lab monitoring. Feedback welcome!* From e7e4509016ed18be1204cf53908168d2fd4a1398 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 22 Jan 2026 12:32:10 -0400 Subject: [PATCH 56/64] Update README.md --- README.md | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 63907b2..fc5fb83 100644 --- a/README.md +++ b/README.md @@ -41,10 +41,24 @@ You can find the latest releases in the [Releases section](https://git.marcodear ## Installation ### Option 1: Download built Binary (Recommended) + 1. Go to the [Releases page](https://git.marcodearaujo.com/marcodearaujo/uptime-kuma-dashboard/releases) -2. Download the binary for your operating system -3. Make it executable: `chmod +x uptime-kuma-dashboard` -4. Run it with your Uptime Kuma URL and slug +2. Download the binary for your operating system: + - **Linux (x86_64)**: `uptime-kuma-dashboard-x86_64-unknown-linux-gnu` + - **Linux (ARM64)**: `uptime-kuma-dashboard-aarch64-unknown-linux-gnu` (Raspberry Pi, ARM servers) + - **Windows**: `uptime-kuma-dashboard-x86_64-pc-windows-gnu.exe` +3. Verify the checksum (recommended for security): + ```bash + sha256sum -c SHA256SUMS.txt + ``` +4. Make it executable (Linux/ARM only): + ```bash + chmod +x uptime-kuma-dashboard-* + ``` +5. Run with your parameters: + ```bash + ./uptime-kuma-dashboard-* --base-url="http://your-kuma:3001/" --slug="your-slug" + ``` ### Option 2: Build From Source @@ -77,11 +91,13 @@ The dashboard requires two parameters: - `--slug`: Your status page slug identifier Example: + ```bash ./uptime-kuma-dashboard --base-url="http://192.168.1.100:3001/" --slug="home-services" ``` **Controls during runtime:** + - `q` or `ESC`: Exit the dashboard - `↑`/`↓` or `k`/`j`: Navigate through monitors - `Home`/`End`: Jump to top/bottom of the list @@ -98,6 +114,7 @@ export STATUS_PAGE_SLUG="your-status-page-slug" ## Development Notes This project follows Rust best practices including: + - Comprehensive error handling with `anyhow` - Internationalization-ready architecture - Modular code organization @@ -105,28 +122,17 @@ This project follows Rust best practices including: - Cross-platform compatibility testing The architecture separates concerns into: + - API client layer - Data processing core - UI rendering components - Configuration management - Internationalization system -## Contribution - -While this is primarily a personal project, I welcome suggestions and improvements! If you have ideas for new features or bug fixes: - -1. Fork the repository -2. Create a feature branch (`git checkout -b feature/amazing-feature`) -3. Commit your changes (`git commit -m 'Add some amazing feature'`) -4. Push to the branch (`git push origin feature/amazing-feature`) -5. Open a pull request - -Please note this is a side project, so response times may vary. - ## License This project is available under the MIT License - see the [LICENSE](LICENSE) file for details. --- -*Developed as a personal learning project to improve Rust skills and create a useful tool for my home lab monitoring. Feedback welcome!* +_Developed as a personal learning project to improve Rust skills and create a useful tool for my home lab monitoring. Feedback welcome!_ From 441687f67d6d3314a4706e4c004c1861469b32da Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 22 Jan 2026 16:25:48 -0400 Subject: [PATCH 57/64] Adding LICENSE --- Cargo.lock | 2 +- Cargo.toml | 2 +- LICENSE | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 LICENSE diff --git a/Cargo.lock b/Cargo.lock index 8002565..276e77f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2668,7 +2668,7 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "uptime-kuma-dashboard" -version = "0.1.0" +version = "0.37.0" dependencies = [ "anyhow", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 1610b56..a5f1784 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uptime-kuma-dashboard" -version = "0.1.0" +version = "0.37.0" edition = "2024" [dependencies] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..732499f --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Marco De Araujo + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From c39fed294bce69f65929187eaa37442b3cc0abf1 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 22 Jan 2026 16:35:09 -0400 Subject: [PATCH 58/64] chore: Release uptime-kuma-dashboard version 0.38.0 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 276e77f..c70aab7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2668,7 +2668,7 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "uptime-kuma-dashboard" -version = "0.37.0" +version = "0.38.0" dependencies = [ "anyhow", "chrono", diff --git a/Cargo.toml b/Cargo.toml index a5f1784..9ee139f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uptime-kuma-dashboard" -version = "0.37.0" +version = "0.38.0" edition = "2024" [dependencies] From 436eac2600e13dce070bbe1d66491aba7f325414 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 5 Feb 2026 15:43:15 -0400 Subject: [PATCH 59/64] Fix heartbeats order --- Cargo.lock | 16 ++++++++-------- Cargo.toml | 4 ++-- src/ui/components/monitor_list.rs | 1 - 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c70aab7..22fa853 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -78,9 +78,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.100" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" +checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" [[package]] name = "atomic" @@ -249,9 +249,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.54" +version = "4.5.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" +checksum = "6899ea499e3fb9305a65d5ebf6e3d2248c5fab291f300ad0a704fbe142eae31a" dependencies = [ "clap_builder", "clap_derive", @@ -259,9 +259,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.54" +version = "4.5.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" +checksum = "7b12c8b680195a62a8364d16b8447b01b6c2c8f9aaf68bee653be34d4245e238" dependencies = [ "anstream", "anstyle", @@ -271,9 +271,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.49" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" +checksum = "a92793da1a46a5f2a02a6f4c46c6496b28c43638adea8306fcb0caa1634f24e5" dependencies = [ "heck", "proc-macro2", diff --git a/Cargo.toml b/Cargo.toml index 9ee139f..e742bc9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,13 +4,13 @@ version = "0.38.0" edition = "2024" [dependencies] -clap = { version = "4.5.54", features = ["derive", "env"] } +clap = { version = "4.5.57", features = ["derive", "env"] } reqwest = { version = "0.13.1", default-features = false, features = [ "blocking", "json", "rustls", ] } -anyhow = "1.0" +anyhow = "1.0.101" fluent-templates = "0.13.2" unic-langid = "0.9.6" sys-locale = "0.3.2" diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index 1cab664..f0cff07 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -259,7 +259,6 @@ fn get_cached_status_line(status_history: &[MonitorStatus]) -> Line<'static> { spans.extend( status_history .iter() - .rev() .take(STATUS_LINE_LENGTH) .map(|status| get_status_span(status).clone()), ); From 88138341ae63492561e0c062090e9449d117d10c Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Thu, 5 Feb 2026 15:43:41 -0400 Subject: [PATCH 60/64] chore: Release uptime-kuma-dashboard version 0.38.1 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 22fa853..ce8b738 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2668,7 +2668,7 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "uptime-kuma-dashboard" -version = "0.38.0" +version = "0.38.1" dependencies = [ "anyhow", "chrono", diff --git a/Cargo.toml b/Cargo.toml index e742bc9..d661591 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uptime-kuma-dashboard" -version = "0.38.0" +version = "0.38.1" edition = "2024" [dependencies] From 80bf20cda19d2edb4050049d1be3cceb02c6c6dd Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Sat, 7 Feb 2026 14:34:04 -0400 Subject: [PATCH 61/64] Fix typo --- src/ui/app.rs | 2 +- src/ui/components/monitor_list.rs | 4 ++-- src/ui/dashboard/model.rs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ui/app.rs b/src/ui/app.rs index 0dc9c9c..2e19131 100644 --- a/src/ui/app.rs +++ b/src/ui/app.rs @@ -191,7 +191,7 @@ impl App { } let max_scroll = state - .get_total_lenght() + .get_total_length() .saturating_sub(area[0].height as usize) .saturating_add(1); diff --git a/src/ui/components/monitor_list.rs b/src/ui/components/monitor_list.rs index f0cff07..ae89733 100644 --- a/src/ui/components/monitor_list.rs +++ b/src/ui/components/monitor_list.rs @@ -38,7 +38,7 @@ static STATUS_LINE_CACHE: OnceLock>>> = OnceLo pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut DashboardViewState) { let available_height = area.height as usize; - let max_scroll = state.get_total_lenght().saturating_sub(available_height); + let max_scroll = state.get_total_length().saturating_sub(available_height); if state.scroll_state.get_position() > max_scroll { state.scroll_state = state.scroll_state.position(max_scroll); @@ -48,7 +48,7 @@ pub fn render_monitor_list(main_frame: &mut Frame, area: Rect, state: &mut Dashb let mut current_y = area.y as usize; let mut rendered_height = 0; let mut lines_skipped = 0; - let half = state.get_total_lenght().saturating_div(2); + let half = state.get_total_length().saturating_div(2); for group in state.groups.iter() { let group_height = group.monitors.len() + BORDER_LINES_VIEW; diff --git a/src/ui/dashboard/model.rs b/src/ui/dashboard/model.rs index a59595a..6425d2b 100644 --- a/src/ui/dashboard/model.rs +++ b/src/ui/dashboard/model.rs @@ -81,7 +81,7 @@ impl DashboardViewState { } } - pub fn get_total_lenght(&self) -> usize { + pub fn get_total_length(&self) -> usize { self.total_length } From cc54502a124acf72e9c19bf9f168d246f8e14ba5 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Sat, 7 Feb 2026 14:34:40 -0400 Subject: [PATCH 62/64] chore: Release uptime-kuma-dashboard version 0.38.2 --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ce8b738..62df022 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2668,7 +2668,7 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "uptime-kuma-dashboard" -version = "0.38.1" +version = "0.38.2" dependencies = [ "anyhow", "chrono", diff --git a/Cargo.toml b/Cargo.toml index d661591..acc8090 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "uptime-kuma-dashboard" -version = "0.38.1" +version = "0.38.2" edition = "2024" [dependencies] From 0ad49775fcb6ff06e158cb7d04d78e7802bfcc45 Mon Sep 17 00:00:00 2001 From: Marco De Araujo Date: Tue, 10 Feb 2026 11:53:04 -0400 Subject: [PATCH 63/64] Adding demo --- README.md | 11 +++++++++++ assets/demo.webm | Bin 0 -> 363380 bytes 2 files changed, 11 insertions(+) create mode 100644 assets/demo.webm diff --git a/README.md b/README.md index fc5fb83..5fb739a 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,17 @@ A terminal-based monitoring dashboard for Uptime Kuma that displays service status, uptime percentages, and historical performance data directly in your terminal. Built with Rust for performance and reliability. +## Demo + +![Dashboard Demo](assets/demo.webm) + +Ou usando HTML para melhor controle: + + + ## Overview This personal project started as a way to monitor my home lab services without needing a web browser. It connects to your Uptime Kuma instance API and presents a clean, color-coded view of your services' status with real-time updates. The dashboard works great on servers, remote terminals, or anywhere you prefer a lightweight monitoring solution. diff --git a/assets/demo.webm b/assets/demo.webm new file mode 100644 index 0000000000000000000000000000000000000000..fb10b2439308f94e4a41adbd4656365cd32ed8f7 GIT binary patch literal 363380 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
  • I=oRUtd>B$h!=Tx!ii6eDDKTE@Uf> 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

    !27K~gI^BDKaG>dI7Ww4Sa|zW^Lq$^ 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%0Dm7Muv{u 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�YL5Tct+S~l@kc+ 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

    PhAlC!6!hG6O}1_51DD~LR}@` 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�RSif0s#MY8iL2; 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 Date: Tue, 10 Feb 2026 11:55:01 -0400 Subject: [PATCH 64/64] Fix typo --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 5fb739a..bbfca7e 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,6 @@ A terminal-based monitoring dashboard for Uptime Kuma that displays service stat ## Demo -![Dashboard Demo](assets/demo.webm) - -Ou usando HTML para melhor controle: -