Skip to content

Feat/add deb for rust - #16

Merged
renjuashokan merged 5 commits into
main_rsfrom
feat/add_deb_for_rust
Nov 30, 2025
Merged

Feat/add deb for rust#16
renjuashokan merged 5 commits into
main_rsfrom
feat/add_deb_for_rust

Conversation

@renjuashokan

@renjuashokan renjuashokan commented Nov 30, 2025

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

  • New Features

    • Debian package distribution and installer scripts
    • systemd service for automatic server startup and management
    • Docker-based packaging builder and containerized build helper
  • Documentation

    • Expanded build prerequisites and platform-specific build instructions
    • New Debian installation and configuration guide
  • Chores

    • CI workflows to build artifacts and create releases
    • Updated VCS and Docker ignore lists and packaging-related metadata

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai

coderabbitai Bot commented Nov 30, 2025

Copy link
Copy Markdown

Walkthrough

Adds CI workflows for multi-arch builds and releases, Debian packaging and service/unit files, packaging helper scripts (local and Docker), Dockerfile and .dockerignore, build script updates, docs for Debian install, and VCS ignore updates.

Changes

Cohort / File(s) Summary
CI Workflows
.github/workflows/on-push-build-all.yml, .github/workflows/on-tag-push-create-release.yml
New GitHub Actions: on-push builds Blazor frontend and Rust server (amd64/arm64), produces artifacts, creates tarballs and .deb packages; tag workflow finds latest main_rs build artifacts, prepares/renames assets, and creates/releases a GitHub Release with notes and assets.
Debian packaging metadata & service
debian/control, debian/changelog, debian/filepi.service
New Debian control metadata, initial changelog for v1.0.0, and systemd unit to run /opt/filepi/filepi with env defaults and restart behavior.
Debian packaging scripts & rules
debian/rules, debian/postinst, debian/postrm, build-deb.sh, build-in-docker.sh
Packaging rules and lifecycle scripts; build-deb.sh prepares staging, normalizes control file, injects Maintainer, removes debhelper placeholders, copies binary/webdeploy, computes Installed-Size and builds .deb; build-in-docker.sh runs packaging inside a Docker builder image.
Docker & dockerignore
Dockerfile, .dockerignore
New minimal Debian-based Dockerfile for packaging and .dockerignore to exclude build outputs, .NET artifacts, logs, VCS, IDE files, and macOS files.
Build script updates
build.sh, build.ps1
Switched Rust binary name references from filepi-rust to filepi, enabled DEB packaging path, updated target paths and messages; small whitespace-only PS change.
Frontend whitespace
frontend/FilePiWeb/Layout/EmptyLayout.razor
Whitespace-only edit; no behavioral change.
Docs & README
README.md, docs/DEBIAN-INSTALL.md
README adds LibMan and FFmpeg prerequisites and build commands; new DEBIAN-INSTALL.md documents installation, service configuration via systemd overrides, management and uninstall guidance.
VCS ignore
.gitignore, .dockerignore
Expanded .gitignore entries and new .dockerignore to exclude outputs, temp build dirs, generated binaries, logs, IDE files, and OS-specific artifacts.

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant Dev as Developer (push/tag)
    participant GH as GitHub
    participant Runner as Actions Runner
    participant DotNet as .NET build
    participant Rust as Rust build (amd64/arm64)
    participant Artifact as Artifacts Storage
    participant Packager as Packaging job (tar + deb)
    participant Release as GitHub Release API

    Dev->>GH: push to branch / create tag
    GH->>Runner: trigger on-push / on-tag workflow
    Runner->>DotNet: Build Blazor (LibMan, dotnet publish)
    DotNet-->>Artifact: upload webdeploy artifact
    Runner->>Rust: Build Rust binary (matrix targets)
    Rust-->>Artifact: upload per-arch binary artifacts
    Runner->>Packager: download artifacts, validate, create tar + .deb
    Packager-->>Artifact: upload tarballs & debs
    GH->>Runner: on-tag workflow uses latest main_rs run id
    Runner->>Artifact: download filepi artifacts, extract & rename for tag
    Runner->>Release: create Release and attach prepared assets
    Release-->>Dev: Release published with assets
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

  • Focus areas:
    • build-deb.sh — control file parsing, debhelper placeholder removal, Installed-Size calculation, dpkg-deb fallback.
    • .github/workflows/on-push-build-all.yml — branch/tag parsing, artifact naming, cross-compilation matrix and packaging steps.
    • .github/workflows/on-tag-push-create-release.yml — locating latest successful run, artifact filtering/renaming, and release creation.
    • debian/postinst & postrm — service enable/start/stop semantics and permission handling.
    • build-in-docker.sh & Dockerfile — UID mapping, mounted volumes, and permission implications.

Possibly related PRs

Poem

🐰 In burrows bright the packages gleam,
Binaries baked and webdeploy stream.
Docker hums and actions cheer,
A rabbit ships the release near. 🥕✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 66.67% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately reflects the main objective: adding Debian package (.deb) build support for the Rust server component, which is demonstrated across multiple new files including Dockerfile, build scripts, systemd configuration, and GitHub Actions workflows.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/add_deb_for_rust

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
build.sh (1)

172-191: Debian build prereq check is inconsistent with build-deb.sh expectations

Here you allow either ./filepi or target/release/filepi:

if [ ! -f "filepi" ] && [ ! -f "target/release/filepi" ]; then

but build-deb.sh only looks for filepi in the current directory and errors out otherwise. That can produce a confusing failure path if only target/release/filepi exists.

To keep behavior consistent and user-friendly, auto-copy from target/release when needed and enforce a single canonical location:

-    # Check prerequisites
-    if [ ! -f "filepi" ] && [ ! -f "target/release/filepi" ]; then
-        print_error "filepi binary not found. Run with --type rust first."
-        return 1
-    fi
+    # Ensure filepi binary exists in project root (what build-deb.sh expects)
+    if [ ! -f "filepi" ]; then
+        if [ -f "target/release/filepi" ]; then
+            cp "target/release/filepi" ./filepi
+        else
+            print_error "filepi binary not found. Run ./build.sh --type rust --mode release first."
+            return 1
+        fi
+    fi
🧹 Nitpick comments (9)
Dockerfile (1)

14-14: Consider making the UID configurable.

The hardcoded UID 1000 may not match the host user on all systems, potentially causing permission issues with mounted volumes.

Consider using a build argument to allow flexibility:

+ARG USER_UID=1000
+
 # Create a non-root user matching the host UID (1000)
-RUN useradd -m -u 1000 builder
+RUN useradd -m -u ${USER_UID} builder

Then build with: docker build --build-arg USER_UID=$(id -u) -t filepi-builder .

build.sh (2)

149-168: Align cp source with actual binary name and remove redundant cp

The release/debug branches now copy target/*/filepi into ./filepi, but each uses a duplicated cp ... || cp ... || true chain with the same source/target and silently ignores failures. If the cargo binary name is still filepi-rust, this will “succeed” while leaving no ./filepi. Suggest simplifying and surfacing problems:

-        # Copy binary to root for easier access
-        cp target/release/filepi ./filepi || cp target/release/filepi ./filepi 2>/dev/null || true
+        # Copy binary to root for easier access
+        cp "target/release/filepi" ./filepi 2>/dev/null \
+          || print_warning "Could not copy target/release/filepi to ./filepi (check binary name/target)."
...
-        # Copy binary to root for easier access
-        cp target/debug/filepi ./filepi || cp target/debug/filepi ./filepi 2>/dev/null || true
+        # Copy binary to root for easier access
+        cp "target/debug/filepi" ./filepi 2>/dev/null \
+          || print_warning "Could not copy target/debug/filepi to ./filepi (check binary name/target)."

Also please double‑check that cargo actually produces filepi (not filepi-rust) so the copy works as expected.


29-73: Help text says default build mode is release, but script sets debug

BUILD_MODE is initialized to "debug" while the help text advertises --mode [debug|release] (default: release). Either change the default to release or adjust the help text so users aren’t surprised by slower debug builds.

-BUILD_MODE="debug"
+BUILD_MODE="release"

(or update the help string instead, if debug is intentional.)

debian/postinst (1)

4-32: Guard systemd calls in postinst for non-systemd environments

Under set -e, systemctl daemon-reload and systemctl enable filepi.service will fail installations on systems without systemd (or in chroots/containers) even though the package contents are otherwise fine. Consider wrapping these in checks:

if command -v systemctl >/dev/null 2>&1 && [ -d /run/systemd/system ]; then
    systemctl daemon-reload || true
    systemctl enable filepi.service || true
    systemctl start filepi.service || true
fi

This keeps behavior correct on systemd hosts without breaking installs in lighter environments.

build-in-docker.sh (1)

4-9: Remove unused YELLOW color constant (lint cleanup)

Shellcheck flags YELLOW as unused here. Either remove it or start using it for a warning helper to keep the script clean and quiet under lint:

-YELLOW='\033[1;33m'

(or add a print_warning that uses it, similar to build.sh).

.github/workflows/on-push-build-all.yml (1)

40-67: Tighten quoting when writing to $GITHUB_OUTPUT (Shellcheck SC2086/SC2129)

Shellcheck (via actionlint) points out unquoted $GITHUB_OUTPUT and repeated redirects. Safer, lint-clean pattern:

-        echo "build-name=$VERSION" >> $GITHUB_OUTPUT
-        echo "version=$VERSION" >> $GITHUB_OUTPUT
-        echo "deb-version=$DEB_VERSION" >> $GITHUB_OUTPUT
+        {
+          echo "build-name=$VERSION"
+          echo "version=$VERSION"
+          echo "deb-version=$DEB_VERSION"
+        } >> "$GITHUB_OUTPUT"

Prevents issues if the path ever contains spaces and resolves SC2086/SC2129.

build-deb.sh (1)

61-102: Limit which debian/* files are copied into DEBIAN for a cleaner package layout

cp -r debian/* "${STAGING_DIR}/DEBIAN/" pulls in everything under debian/ (rules, changelog, compat, etc.) into the control area, then you delete only filepi.service. While dpkg-deb will mostly ignore the extra files, it’s unconventional and makes the package noisier than necessary.

Consider copying only the control-related files:

-if [ -d "debian" ]; then
-    cp -r debian/* "${STAGING_DIR}/DEBIAN/"
+if [ -d "debian" ]; then
+    for f in control postinst postrm preinst prerm; do
+        [ -f "debian/$f" ] && cp "debian/$f" "${STAGING_DIR}/DEBIAN/"
+    done

You can then drop the rm -f "${STAGING_DIR}/DEBIAN/filepi.service" line. This keeps the generated .deb closer to Debian norms while preserving your existing control-file processing.

.github/workflows/on-tag-push-create-release.yml (2)

129-177: Simplify filename substitution using bash parameter expansion.

Lines 158 and 169 use sed for filename substitution, which is flagged by shellcheck as an opportunity to use bash built-in parameter expansion for better portability and performance. Additionally, the script lacks error handling if no .tar.gz or .deb files are found in the artifacts directory.

Apply this diff to use bash parameter expansion instead of sed:

         # Rename artifacts to include tag version instead of build number
         echo "Preparing release assets..."
         
         # Process binary tarballs
         for tarball in ${{ env.ARTIFACTS_DIR }}/*.tar.gz; do
           if [ -f "$tarball" ]; then
             filename=$(basename "$tarball")
-            # Replace the build name with tag name in filename
-            new_filename=$(echo "$filename" | sed "s/main_rs_[0-9]\+/${TAG_NAME}/g")
+            # Replace the build name with tag name in filename
+            new_filename="${filename//main_rs_[0-9]*/}"
+            new_filename="${new_filename}${TAG_NAME}${filename##*main_rs_[0-9]*}"

Alternative (simpler):

-            new_filename=$(echo "$filename" | sed "s/main_rs_[0-9]\+/${TAG_NAME}/g")
+            new_filename="${filename//main_rs_+([0-9])/${TAG_NAME}}"

Note: The second approach assumes shopt -s extglob is enabled or use sed if portability to shells without extglob is required.


295-322: Refactor release summary script to fix quoting and redirect patterns.

Shellcheck flags multiple issues in the Release Summary step:

  • SC2012: Using ls in a context better served by find
  • SC2086: Unquoted variables that could cause word splitting
  • SC2129: Multiple >> redirects that could be combined

Apply this diff to improve robustness and follow shell best practices:

     - name: Release Summary
       run: |
-        echo "## 🎉 FilePi Server Release Created Successfully!" >> $GITHUB_STEP_SUMMARY
-        echo "" >> $GITHUB_STEP_SUMMARY
-        echo "**🏷️ Tag:** ${{ needs.common-vars.outputs.tag-name }}" >> $GITHUB_STEP_SUMMARY
-        echo "**📦 Release:** ${{ needs.common-vars.outputs.release-name }}" >> $GITHUB_STEP_SUMMARY
-        echo "**🔖 Type:** ${{ needs.common-vars.outputs.is-prerelease == 'true' && 'Pre-release' || 'Stable Release' }}" >> $GITHUB_STEP_SUMMARY
-        echo "**🔨 Source Build:** Run #${{ needs.common-vars.outputs.latest-run-id }} from main_rs" >> $GITHUB_STEP_SUMMARY
-        echo "" >> $GITHUB_STEP_SUMMARY
-        echo "### 📦 Release Assets:" >> $GITHUB_STEP_SUMMARY
-        for file in ${{ env.RELEASE_DIR }}/*; do
+        {
+          echo "## 🎉 FilePi Server Release Created Successfully!"
+          echo ""
+          echo "**🏷️ Tag:** ${{ needs.common-vars.outputs.tag-name }}"
+          echo "**📦 Release:** ${{ needs.common-vars.outputs.release-name }}"
+          echo "**🔖 Type:** ${{ needs.common-vars.outputs.is-prerelease == 'true' && 'Pre-release' || 'Stable Release' }}"
+          echo "**🔨 Source Build:** Run #${{ needs.common-vars.outputs.latest-run-id }} from main_rs"
+          echo ""
+          echo "### 📦 Release Assets:"
+          find "${{ env.RELEASE_DIR }}" -maxdepth 1 -type f ! -name "RELEASE_NOTES.md" | while read -r file; do
-          if [ -f "$file" ] && [[ "$file" != *"RELEASE_NOTES.md" ]]; then
-            filename=$(basename "$file")
-            size=$(ls -lh "$file" | awk '{print $5}')
-            if [[ "$filename" == *.tar.gz ]]; then
-              echo "- 🗃️ $filename ($size) - Binary with Web UI" >> $GITHUB_STEP_SUMMARY
-            elif [[ "$filename" == *.deb ]]; then
-              echo "- 📦 $filename ($size) - Debian Package" >> $GITHUB_STEP_SUMMARY
+            filename=$(basename "$file")
+            size=$(stat -f%z "$file" 2>/dev/null || stat -c%s "$file" 2>/dev/null)  # Works on macOS and Linux
+            size=$(numfmt --to=iec-i --suffix=B "$size" 2>/dev/null || echo "$size B")  # Format bytes
+            if [[ "$filename" == *.tar.gz ]]; then
+              echo "- 🗃️ $filename ($size) - Binary with Web UI"
+            elif [[ "$filename" == *.deb ]]; then
+              echo "- 📦 $filename ($size) - Debian Package"
             fi
-          fi
+          done
-        done
-        echo "" >> $GITHUB_STEP_SUMMARY
-        echo "### 🌟 Key Features:" >> $GITHUB_STEP_SUMMARY
-        echo "- 🌐 Modern Blazor WebAssembly frontend" >> $GITHUB_STEP_SUMMARY
-        echo "- 📱 Responsive design for all devices" >> $GITHUB_STEP_SUMMARY
-        echo "- 🎬 Video streaming with thumbnails" >> $GITHUB_STEP_SUMMARY
-        echo "- 📁 Complete file management" >> $GITHUB_STEP_SUMMARY
-        echo "- ⚡ Optimized for Raspberry Pi" >> $GITHUB_STEP_SUMMARY
+          echo ""
+          echo "### 🌟 Key Features:"
+          echo "- 🌐 Modern Blazor WebAssembly frontend"
+          echo "- 📱 Responsive design for all devices"
+          echo "- 🎬 Video streaming with thumbnails"
+          echo "- 📁 Complete file management"
+          echo "- ⚡ Optimized for Raspberry Pi"
+        } >> "$GITHUB_STEP_SUMMARY"

Note: The script continues to run on ubuntu-latest, so stat is available. However, the refactored version is slightly more complex; you may prefer to keep the simpler original if the quoting warnings don't impact functionality.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3d37546 and 191e1a2.

📒 Files selected for processing (17)
  • .dockerignore (1 hunks)
  • .github/workflows/on-push-build-all.yml (1 hunks)
  • .github/workflows/on-tag-push-create-release.yml (1 hunks)
  • .gitignore (1 hunks)
  • Dockerfile (1 hunks)
  • README.md (1 hunks)
  • build-deb.sh (1 hunks)
  • build-in-docker.sh (1 hunks)
  • build.sh (4 hunks)
  • debian/changelog (1 hunks)
  • debian/compat (1 hunks)
  • debian/control (1 hunks)
  • debian/filepi.service (1 hunks)
  • debian/postinst (1 hunks)
  • debian/postrm (1 hunks)
  • debian/rules (1 hunks)
  • docs/DEBIAN-INSTALL.md (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (2)
build.sh (1)
build-in-docker.sh (2)
  • print_success (15-17)
  • print_step (11-13)
build-in-docker.sh (1)
build.sh (3)
  • print_error (24-26)
  • print_step (12-14)
  • print_success (16-18)
🪛 actionlint (1.7.9)
.github/workflows/on-push-build-all.yml

42-42: shellcheck reported issue in this script: SC2086:info:18:31: Double quote to prevent globbing and word splitting

(shellcheck)


42-42: shellcheck reported issue in this script: SC2086:info:19:28: Double quote to prevent globbing and word splitting

(shellcheck)


42-42: shellcheck reported issue in this script: SC2086:info:20:36: Double quote to prevent globbing and word splitting

(shellcheck)


42-42: shellcheck reported issue in this script: SC2129:style:18:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)


158-158: shellcheck reported issue in this script: SC2012:info:18:12: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


158-158: shellcheck reported issue in this script: SC2012:info:9:12: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


158-158: shellcheck reported issue in this script: SC2086:info:10:35: Double quote to prevent globbing and word splitting

(shellcheck)


158-158: shellcheck reported issue in this script: SC2086:info:13:12: Double quote to prevent globbing and word splitting

(shellcheck)


158-158: shellcheck reported issue in this script: SC2086:info:14:34: Double quote to prevent globbing and word splitting

(shellcheck)


158-158: shellcheck reported issue in this script: SC2086:info:19:35: Double quote to prevent globbing and word splitting

(shellcheck)


158-158: shellcheck reported issue in this script: SC2086:info:1:30: Double quote to prevent globbing and word splitting

(shellcheck)


158-158: shellcheck reported issue in this script: SC2086:info:2:12: Double quote to prevent globbing and word splitting

(shellcheck)


158-158: shellcheck reported issue in this script: SC2086:info:3:54: Double quote to prevent globbing and word splitting

(shellcheck)


158-158: shellcheck reported issue in this script: SC2086:info:4:12: Double quote to prevent globbing and word splitting

(shellcheck)


158-158: shellcheck reported issue in this script: SC2086:info:5:61: Double quote to prevent globbing and word splitting

(shellcheck)


158-158: shellcheck reported issue in this script: SC2129:style:1:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)

.github/workflows/on-tag-push-create-release.yml

130-130: shellcheck reported issue in this script: SC2001:style:28:20: See if you can use ${variable//search/replace} instead

(shellcheck)


130-130: shellcheck reported issue in this script: SC2001:style:39:20: See if you can use ${variable//search/replace} instead

(shellcheck)


296-296: shellcheck reported issue in this script: SC2012:info:12:12: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:14:61: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:16:56: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:1:60: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:20:12: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:21:31: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:22:50: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:23:49: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:24:47: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:25:40: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:26:42: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:2:12: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:3:65: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:4:72: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:5:117: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:6:96: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:7:12: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2086:info:8:33: Double quote to prevent globbing and word splitting

(shellcheck)


296-296: shellcheck reported issue in this script: SC2129:style:1:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)


296-296: shellcheck reported issue in this script: SC2129:style:20:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)

🪛 Shellcheck (0.11.0)
build-in-docker.sh

[warning] 7-7: YELLOW appears unused. Verify use (or export if used externally).

(SC2034)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: build (arm64)
  • GitHub Check: build (amd64)
🔇 Additional comments (8)
debian/changelog (1)

5-5: Verify the changelog date.

The timestamp shows a future date (March 9, 2025). Debian changelog entries typically use the actual date of the release or package creation.

Please confirm whether this is:

  • A placeholder that should be updated to the current date
  • An intentional future date for testing purposes
.gitignore (1)

27-31: LGTM!

The new ignore patterns appropriately exclude build artifacts, packaging outputs, and executable binaries generated by the build and packaging workflows.

README.md (1)

12-40: LGTM!

The prerequisite and build documentation is clear and accurate. The platform-specific FFmpeg installation commands are correct for Debian/Ubuntu and macOS systems.

.dockerignore (1)

1-26: LGTM!

The ignore patterns comprehensively cover build artifacts, logs, version control, and development environment files, ensuring clean Docker image builds.

Dockerfile (1)

20-20: Build script verification confirms no issues.

The build-deb.sh script exists at the repository root with proper executable permissions (rwxr-xr-x). The Dockerfile's CMD ["./build-deb.sh"] instruction is correctly configured and will execute as expected.

build.sh (1)

216-227: Generated-files summary omits error handling but looks consistent with new paths

The final summary now checks for target/release/filepi and target/debug/filepi, matching the earlier copy commands. Once the build_rust cp logic is corrected, this section is fine and will accurately reflect built binaries.

.github/workflows/on-push-build-all.yml (2)

157-179: Summary step is fine; ls-based size lookup is acceptable here

The artifact listing uses ls -lh "$file" | awk '{print $5}' and simple for file in all-artifacts/*.tar.gz loops. Shellcheck prefers find/stat, but for CI summary output this is adequate and easy to read. No changes needed unless you want stricter lint cleanliness.


35-43: The .NET 10.0.x version is valid and currently available.

.NET 10.0.0 (LTS) was released on November 11, 2025, with SDK 10.0.100 available. The version string '10.0.x' is a supported syntax for actions/setup-dotnet@v5 (documented as A.B.x format to resolve to the latest patch on that channel). The workflow will not fail due to this version specification.

Comment thread .github/workflows/on-push-build-all.yml
Comment thread debian/compat Outdated
@@ -0,0 +1 @@
Build-Depends: debhelper-compat (>= 10) No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Incorrect file format - this will break package builds.

The debian/compat file should contain only a single integer representing the debhelper compatibility level (e.g., 10 or 12), not a Build-Depends declaration. The Build-Depends: debhelper-compat (= 12) declaration belongs in debian/control (which already has it according to the PR changes).

Modern Debian packaging typically uses debhelper-compat in the Build-Depends field of debian/control and doesn't require a separate debian/compat file. You can either:

Option 1 (Recommended): Remove this file entirely since debian/control already declares debhelper-compat (= 12).

Option 2: Replace the content with a single integer:

-Build-Depends: debhelper-compat (>= 10)
+12
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Build-Depends: debhelper-compat (>= 10)
12
🤖 Prompt for AI Agents
In debian/compat around lines 1-1, the file incorrectly contains a Build-Depends
declaration instead of a single debhelper compatibility integer; remove this
file entirely (preferred) since debian/control already declares debhelper-compat
(= 12), or replace its contents with the single integer "12" (no other text) if
you must keep the file.

Comment thread debian/control Outdated
Comment thread debian/filepi.service
Comment on lines +5 to +13
[Service]
Type=simple
User=root
WorkingDirectory=/opt/filepi
ExecStart=/opt/filepi/filepi
Restart=always
RestartSec=10
Environment=FILE_PI_PORT=8080
Environment=FILE_PI_ROOT_DIR=/var/lib/filepi/media

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Service runs as root; consider dedicated system user for security

User=root means the HTTP server runs with full privileges. Safer pattern is to create a dedicated filepi system user (in postinst), chown /opt/filepi and /var/lib/filepi, and run the unit as that user. You may also want Restart=on-failure instead of always so manual stops don’t get auto‑restarted.

🤖 Prompt for AI Agents
In debian/filepi.service around lines 5 to 13 the unit runs the service as root
and always restarts; create and use a dedicated system user (e.g. filepi)
instead of root: update packaging/postinst to create a system user/group (system
account, no login), chown /opt/filepi and /var/lib/filepi to that user and
ensure WorkingDirectory and ExecStart paths are readable/executable by it, then
change User=root to User=filepi in the unit file; also change Restart=always to
Restart=on-failure so manual stops are respected (or document why always is
desired) and ensure the postinst enables/reloads the systemd unit after
installation.

Comment thread debian/postrm
Comment thread debian/rules
Comment thread docs/DEBIAN-INSTALL.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 191e1a2 and 1428897.

📒 Files selected for processing (2)
  • .github/workflows/on-push-build-all.yml (1 hunks)
  • .github/workflows/on-tag-push-create-release.yml (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: Build Rust (arm64)
  • GitHub Check: Build Blazor Frontend
🔇 Additional comments (8)
.github/workflows/on-push-build-all.yml (5)

14-50: Version and artifact naming logic is sound.

The setup job correctly derives build-name, version, and deb-version from branch/run context. Branch name extraction handles both PR and push events, and the Debian version format complies with conventions.


51-77: Blazor build and artifact upload is standard.

The job correctly sets up .NET, installs dependencies, builds the frontend via build.sh, and uploads the webdeploy directory with appropriate retention.


79-127: Rust build with cross-compilation matrix is correct.

The job properly sets up per-architecture toolchains, conditionally installs ARM linker dependencies, and builds the binary with the correct name. The past critical issue referencing a non-existent binary name has been fixed.


208-240: Build summary job is well-structured.

The job correctly downloads all per-arch artifacts and generates a formatted summary with file sizes and types. Defensive file existence checks prevent errors if artifacts are missing.


184-194: Verify dpkg-deb availability or add explicit error checking to build-deb.sh.

The build-deb.sh script is present and correctly outputs to outputs/filepi_*.deb. However, line 149-150 of build-deb.sh silently skips package creation if dpkg-deb is unavailable, only printing a warning. This causes line 191's mv command to fail (not silently, but loudly) when no file matches the glob. Either ensure the build environment has dpkg-deb available, or add explicit error handling in build-deb.sh to exit with a failure if the .deb file is not created.

.github/workflows/on-tag-push-create-release.yml (3)

14-73: Tag parsing and latest build discovery is sound.

The job correctly extracts tag information, determines prerelease status based on semantic versioning conventions, and queries for the latest successful build on main_rs with appropriate error handling.


129-176: Asset preparation with tag-based renaming is correct.

The sed pattern correctly matches and replaces the build number with the tag name in both tarball and Debian package filenames, ensuring released artifacts use the tag version rather than build numbers.


289-321: Cleanup and release summary steps are well-structured.

The job appropriately removes temporary artifacts and generates a comprehensive summary with release metadata and asset details.

Comment thread .github/workflows/on-tag-push-create-release.yml Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
build-deb.sh (2)

84-98: Control file sed operations could be combined for efficiency (optional refactor).

The current approach runs four separate sed operations on the control file, each writing to a temp file and moving it back. While this works correctly and is readable, it could be optimized into a single sed pass or combined regex for better efficiency:

# Current: 4 passes
sed 's/${shlibs:Depends}, //g' "$CONTROL_FILE" > "$CONTROL_TMP" && mv "$CONTROL_TMP" "$CONTROL_FILE"
sed 's/${misc:Depends}, //g' "$CONTROL_FILE" > "$CONTROL_TMP" && mv "$CONTROL_TMP" "$CONTROL_FILE"
# ... etc

# Optional: Combined single pass (using ; or -e)
sed -e 's/${shlibs:Depends}, //g' -e 's/${misc:Depends}, //g' -e 's/Depends: , /Depends: /g' "$CONTROL_FILE" > "$CONTROL_TMP" && mv "$CONTROL_TMP" "$CONTROL_FILE"

This is a nice-to-have optimization; the current implementation is functionally correct.


76-79: Sed -i portability handled reasonably but could be clearer.

The fallback pattern sed -i.bak "..." || sed -i "" "..." works across Linux and macOS but relies on the first command failing. A more explicit approach (checking uname or using gsed on macOS if available) would reduce ambiguity. However, this is acceptable for a build script that runs in CI where the environment is controlled.

.github/workflows/on-push-build-all.yml (1)

25-49: Shell script quoting improvements for robustness.

Lines 25–49 (and similar patterns in lines 220+) have several unquoted variable expansions flagged by actionlint (SC2086). While these work in CI, quoting $GITHUB_OUTPUT and similar variables protects against word-splitting and globbing edge cases. Additionally, consider grouping multiple >> redirects into a single block (SC2129).

Example improvement:

-        echo "build-name=$VERSION" >> $GITHUB_OUTPUT
-        echo "version=$VERSION" >> $GITHUB_OUTPUT
-        echo "deb-version=$DEB_VERSION" >> $GITHUB_OUTPUT
+        {
+          echo "build-name=$VERSION"
+          echo "version=$VERSION"
+          echo "deb-version=$DEB_VERSION"
+        } >> "$GITHUB_OUTPUT"

This is a style refinement; functionality is not impacted.

.github/workflows/on-tag-push-create-release.yml (1)

327-344: Shell script quoting improvements for robustness.

Lines 327–344 (Release Summary loop) contain unquoted variable expansions flagged by actionlint (SC2086). While these work in CI, quoting "$file" and "$filename" protects against edge cases:

-        for file in ${{ env.RELEASE_DIR }}/*; do
-          if [ -f "$file" ] && [[ "$file" != *"RELEASE_NOTES.md" ]]; then
+        for file in "${{ env.RELEASE_DIR }}"/*; do
+          if [ -f "$file" ] && [[ "$file" != *"RELEASE_NOTES.md" ]]; then

This is a style refinement; functionality is not impacted.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1428897 and 5e76d37.

📒 Files selected for processing (11)
  • .github/workflows/on-push-build-all.yml (1 hunks)
  • .github/workflows/on-tag-push-create-release.yml (1 hunks)
  • build-deb.sh (1 hunks)
  • build.ps1 (1 hunks)
  • build.sh (6 hunks)
  • debian/control (1 hunks)
  • debian/postinst (1 hunks)
  • debian/postrm (1 hunks)
  • debian/rules (1 hunks)
  • docs/DEBIAN-INSTALL.md (1 hunks)
  • frontend/FilePiWeb/Layout/EmptyLayout.razor (1 hunks)
✅ Files skipped from review due to trivial changes (2)
  • build.ps1
  • frontend/FilePiWeb/Layout/EmptyLayout.razor
🚧 Files skipped from review as they are similar to previous changes (4)
  • debian/postrm
  • debian/rules
  • debian/control
  • debian/postinst
🧰 Additional context used
🪛 actionlint (1.7.9)
.github/workflows/on-push-build-all.yml

25-25: shellcheck reported issue in this script: SC2086:info:18:31: Double quote to prevent globbing and word splitting

(shellcheck)


25-25: shellcheck reported issue in this script: SC2086:info:19:28: Double quote to prevent globbing and word splitting

(shellcheck)


25-25: shellcheck reported issue in this script: SC2086:info:20:36: Double quote to prevent globbing and word splitting

(shellcheck)


25-25: shellcheck reported issue in this script: SC2129:style:18:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)


220-220: shellcheck reported issue in this script: SC2012:info:18:12: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


220-220: shellcheck reported issue in this script: SC2012:info:9:12: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:10:35: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:13:12: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:14:34: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:19:35: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:1:30: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:2:12: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:3:54: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:4:12: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:5:61: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2129:style:1:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)

.github/workflows/on-tag-push-create-release.yml

130-130: shellcheck reported issue in this script: SC2001:style:28:20: See if you can use ${variable//search/replace} instead

(shellcheck)


130-130: shellcheck reported issue in this script: SC2001:style:39:20: See if you can use ${variable//search/replace} instead

(shellcheck)


277-277: shellcheck reported issue in this script: SC2012:info:12:13: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


277-277: shellcheck reported issue in this script: SC2012:info:4:17: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


318-318: shellcheck reported issue in this script: SC2012:info:12:12: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:14:61: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:16:56: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:1:60: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:20:12: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:21:31: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:22:50: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:23:49: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:24:47: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:25:40: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:26:42: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:2:12: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:3:65: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:4:72: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:5:117: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:6:96: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:7:12: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:8:33: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2129:style:1:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)


318-318: shellcheck reported issue in this script: SC2129:style:20:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build Blazor Frontend
🔇 Additional comments (9)
build.sh (2)

155-155: Redundant binary copy commands—clarify intent or simplify.

Lines 155 and 164 both repeat the same cp command twice (with identical source and destination). This appears to be a copy-paste error or unclear fallback logic. Either clarify the intent or simplify to a single command:

-        cp target/release/filepi ./filepi || cp target/release/filepi ./filepi 2>/dev/null || true
+        cp target/release/filepi ./filepi || true

Apply the same fix to line 164 for debug mode.

Also applies to: 164-164


176-177: Binary naming and build workflow updates look correct.

The prerequisites check now correctly references filepi (not the old filepi-rust), the deb case is properly enabled in the build type switch, and the final output listing appropriately shows all possible binary locations. Build orchestration aligns with the packaging scripts.

Also applies to: 201-203, 222-227

docs/DEBIAN-INSTALL.md (1)

146-160: Uninstall paths are now clear and mutually consistent.

The distinction between non-purge (preserve data) and purge (remove all) is now explicit, with each path clearly labeled and the destructive behavior documented. The previous review concern about conflicting guidance has been addressed.

build-deb.sh (1)

29-40: Prerequisite checks, file copying, and dpkg-deb handling are solid.

Binary and webdeploy validation work correctly; permissions are set appropriately; installed-size calculation is accurate; and the fallback for missing dpkg-deb gracefully handles limited environments while still leaving useful artifacts.

Also applies to: 115-139, 143-151

.github/workflows/on-push-build-all.yml (2)

116-116: Binary copy now correctly references filepi (not the old filepi-rust).

The path correctly points to the actual Rust binary produced by cargo, ensuring the packaging step will find the binary. This fixes the prior critical issue flagged in the previous review.


128-206: Multi-arch CI/CD orchestration is well-structured.

Setup, Blazor build, multi-arch Rust builds, and packaging jobs are logically organized with appropriate dependencies. Artifact naming, uploading, and verification steps are clear and maintainable. The tarball and Debian package creation workflows separate cleanly without duplication.

.github/workflows/on-tag-push-create-release.yml (3)

276-309: Asset verification and fail-fast behavior now properly in place.

The explicit verification step (lines 276–296) counts expected tarballs and Debian packages, failing clearly if either count is zero. Combined with fail_on_unmatched_files: true (line 309), the release action now fails fast rather than silently creating an incomplete release. This directly addresses the previous review concern about missing safeguards.


50-74: Latest build lookup handles edge cases well.

The GitHub API query to fetch the latest successful main_rs build includes proper error handling (lines 65–68) when no successful builds exist. Output of run ID and commit SHA is useful for traceability.


154-173: Asset renaming and release notes generation are clear and appropriate.

The sed-based tag replacement (lines 158, 169) is readable and handles the version substitution correctly. Release notes (lines 200–274) are well-organized with clear sections, installation steps, feature highlights, and links. Format and content are user-friendly.

Also applies to: 200-274

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (4)
.github/workflows/on-tag-push-create-release.yml (1)

158-158: Consider using bash parameter expansion instead of sed for variable substitution.

Lines 158 and 169 use sed to replace the build number placeholder. For improved readability and to align with shell best practices, you could use bash parameter expansion instead:

  # Replace the build name with tag name in filename
- new_filename=$(echo "$filename" | sed "s/main_rs_[0-9]\+/${TAG_NAME}/g")
+ new_filename="${filename//main_rs_[0-9]*/}"  # or similar pattern
+ new_filename="${TAG_NAME}${new_filename##*main_rs_[0-9]*}"

Alternatively, if the pattern match is non-trivial for parameter expansion, sed is acceptable. This is purely optional.

Also applies to: 169-169

.github/workflows/on-push-build-all.yml (2)

25-49: Optional: Address shellcheck style suggestions in the setup script.

The static analysis tool flagged several minor shell script style issues:

  • Variables in echo statements should be quoted
  • Multiple redirects to $GITHUB_OUTPUT could be combined using a brace group

Apply this diff to improve shell script style:

-        echo "build-name=$VERSION" >> $GITHUB_OUTPUT
-        echo "version=$VERSION" >> $GITHUB_OUTPUT
-        echo "deb-version=$DEB_VERSION" >> $GITHUB_OUTPUT
+        {
+          echo "build-name=${VERSION}"
+          echo "version=${VERSION}"
+          echo "deb-version=${DEB_VERSION}"
+        } >> "$GITHUB_OUTPUT"

219-241: Optional: Address shellcheck warnings in the summary script.

The static analysis tool flagged several shell script style issues in the artifact listing logic:

  • Using ls -lh piped to awk instead of more portable commands
  • Unquoted variables in several places

Consider applying these improvements:

         echo "### 📦 Rust Binaries (with Blazor WebAssembly UI):" >> $GITHUB_STEP_SUMMARY
         for file in all-artifacts/*.tar.gz; do
           if [ -f "$file" ]; then
             filename=$(basename "$file")
-            size=$(ls -lh "$file" | awk '{print $5}')
-            echo "- $filename ($size)" >> $GITHUB_STEP_SUMMARY
+            size=$(du -h "$file" | cut -f1)
+            echo "- ${filename} (${size})" >> "$GITHUB_STEP_SUMMARY"
           fi
         done
         echo "" >> $GITHUB_STEP_SUMMARY
         echo "### 📦 Debian Packages:" >> $GITHUB_STEP_SUMMARY
         for file in all-artifacts/*.deb; do
           if [ -f "$file" ]; then
             filename=$(basename "$file")
-            size=$(ls -lh "$file" | awk '{print $5}')
-            echo "- $filename ($size)" >> $GITHUB_STEP_SUMMARY
+            size=$(du -h "$file" | cut -f1)
+            echo "- ${filename} (${size})" >> "$GITHUB_STEP_SUMMARY"
           fi
         done
debian/control (1)

5-5: Update debhelper-compat to version 13 and Standards-Version to 4.7.0.

The current debhelper-compat (= 12) is from Debian 10, which has limited support. Version 13 (available since Debian 11) is the current standard for modern Debian packaging and better aligns with the package's unstable distribution target. Updating Standards-Version from 4.5.0 to 4.7.0 would also ensure compliance with current Debian policy.

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5e76d37 and b38c617.

📒 Files selected for processing (11)
  • .github/workflows/on-push-build-all.yml (1 hunks)
  • .github/workflows/on-tag-push-create-release.yml (1 hunks)
  • build-deb.sh (1 hunks)
  • build.ps1 (1 hunks)
  • build.sh (6 hunks)
  • debian/control (1 hunks)
  • debian/postinst (1 hunks)
  • debian/postrm (1 hunks)
  • debian/rules (1 hunks)
  • docs/DEBIAN-INSTALL.md (1 hunks)
  • frontend/FilePiWeb/Layout/EmptyLayout.razor (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • build.ps1
🚧 Files skipped from review as they are similar to previous changes (6)
  • debian/postrm
  • docs/DEBIAN-INSTALL.md
  • debian/rules
  • build.sh
  • build-deb.sh
  • frontend/FilePiWeb/Layout/EmptyLayout.razor
🧰 Additional context used
🪛 actionlint (1.7.9)
.github/workflows/on-push-build-all.yml

25-25: shellcheck reported issue in this script: SC2086:info:18:31: Double quote to prevent globbing and word splitting

(shellcheck)


25-25: shellcheck reported issue in this script: SC2086:info:19:28: Double quote to prevent globbing and word splitting

(shellcheck)


25-25: shellcheck reported issue in this script: SC2086:info:20:36: Double quote to prevent globbing and word splitting

(shellcheck)


25-25: shellcheck reported issue in this script: SC2129:style:18:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)


220-220: shellcheck reported issue in this script: SC2012:info:18:12: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


220-220: shellcheck reported issue in this script: SC2012:info:9:12: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:10:35: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:13:12: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:14:34: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:19:35: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:1:30: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:2:12: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:3:54: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:4:12: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2086:info:5:61: Double quote to prevent globbing and word splitting

(shellcheck)


220-220: shellcheck reported issue in this script: SC2129:style:1:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)

.github/workflows/on-tag-push-create-release.yml

130-130: shellcheck reported issue in this script: SC2001:style:28:20: See if you can use ${variable//search/replace} instead

(shellcheck)


130-130: shellcheck reported issue in this script: SC2001:style:39:20: See if you can use ${variable//search/replace} instead

(shellcheck)


277-277: shellcheck reported issue in this script: SC2012:info:12:13: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


277-277: shellcheck reported issue in this script: SC2012:info:4:17: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


318-318: shellcheck reported issue in this script: SC2012:info:12:12: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:14:61: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:16:56: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:1:60: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:20:12: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:21:31: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:22:50: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:23:49: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:24:47: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:25:40: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:26:42: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:2:12: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:3:65: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:4:72: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:5:117: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:6:96: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:7:12: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:8:33: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2129:style:1:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)


318-318: shellcheck reported issue in this script: SC2129:style:20:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build Blazor Frontend
🔇 Additional comments (3)
.github/workflows/on-tag-push-create-release.yml (1)

276-309: ✅ Previous critical issue fully resolved.

The verification step (lines 276–296) now explicitly checks for both tarball and Debian package patterns and fails immediately if either is missing, before attempting release creation. Combined with fail_on_unmatched_files: true on line 309, this ensures the release cannot be created with missing assets. The fail-fast approach is solid.

.github/workflows/on-push-build-all.yml (2)

79-126: Build Rust job looks good!

The cross-compilation setup for amd64 and arm64 is correctly configured with appropriate toolchain targets and linkers. The binary name reference has been fixed from the previous review.


59-62: No issue with .NET version specification.

.NET 10 was released on November 11, 2025, and is available as an LTS release. The workflow's specification of dotnet-version: '10.0.x' is correct and will not cause build failures.

Comment on lines +184 to +194
- name: Build Debian package
run: |
echo "Building Debian package..."
chmod +x build-deb.sh
./build-deb.sh "${{ needs.setup.outputs.deb-version }}" "${{ matrix.arch }}"

# Rename the deb file to include architecture
mv outputs/filepi_*.deb filepi_${{ needs.setup.outputs.build-name }}_${{ matrix.arch }}.deb

echo "Debian package created:"
ls -la filepi_${{ needs.setup.outputs.build-name }}_${{ matrix.arch }}.deb

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion | 🟠 Major

Strengthen the Debian package rename operation.

The mv command on line 191 uses a glob pattern that could match multiple files or fail if the expected file doesn't exist. This could cause silent failures or unexpected behavior.

Apply this diff to make the rename more robust:

         echo "Building Debian package..."
         chmod +x build-deb.sh
         ./build-deb.sh "${{ needs.setup.outputs.deb-version }}" "${{ matrix.arch }}"
 
-        # Rename the deb file to include architecture
-        mv outputs/filepi_*.deb filepi_${{ needs.setup.outputs.build-name }}_${{ matrix.arch }}.deb
+        # Rename the deb file to include build name
+        DEB_FILE=$(find outputs -name "filepi_*.deb" -type f)
+        if [ -z "$DEB_FILE" ]; then
+          echo "ERROR: No .deb file found in outputs/"
+          exit 1
+        fi
+        mv "$DEB_FILE" filepi_${{ needs.setup.outputs.build-name }}_${{ matrix.arch }}.deb
 
         echo "Debian package created:"
         ls -la filepi_${{ needs.setup.outputs.build-name }}_${{ matrix.arch }}.deb
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Build Debian package
run: |
echo "Building Debian package..."
chmod +x build-deb.sh
./build-deb.sh "${{ needs.setup.outputs.deb-version }}" "${{ matrix.arch }}"
# Rename the deb file to include architecture
mv outputs/filepi_*.deb filepi_${{ needs.setup.outputs.build-name }}_${{ matrix.arch }}.deb
echo "Debian package created:"
ls -la filepi_${{ needs.setup.outputs.build-name }}_${{ matrix.arch }}.deb
- name: Build Debian package
run: |
echo "Building Debian package..."
chmod +x build-deb.sh
./build-deb.sh "${{ needs.setup.outputs.deb-version }}" "${{ matrix.arch }}"
# Rename the deb file to include build name
DEB_FILE=$(find outputs -name "filepi_*.deb" -type f)
if [ -z "$DEB_FILE" ]; then
echo "ERROR: No .deb file found in outputs/"
exit 1
fi
mv "$DEB_FILE" filepi_${{ needs.setup.outputs.build-name }}_${{ matrix.arch }}.deb
echo "Debian package created:"
ls -la filepi_${{ needs.setup.outputs.build-name }}_${{ matrix.arch }}.deb
🤖 Prompt for AI Agents
In .github/workflows/on-push-build-all.yml around lines 184–194, the mv that
renames the generated .deb uses a glob that can match zero or multiple files;
replace it with a robust check: expand the glob into an array, validate there is
exactly one match, print a clear error and exit non‑zero if none or multiple
matches, then perform the mv using that single filename to the target filepi_${{
needs.setup.outputs.build-name }}_${{ matrix.arch }}.deb; keep the working
directory explicit and fail the step on error.

Comment thread debian/postinst
find /opt/filepi/webdeploy -type d -exec chmod 755 {} \;

# Create the cache directory
mkdir -p /var/lib/filepi/media/.cache

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Set ownership and permissions for the cache directory.

The cache directory /var/lib/filepi/media/.cache is created but no ownership or permissions are explicitly set. If the service runs as a non-root user, it may not have write access to this directory.

Apply this diff to set appropriate ownership and permissions:

 # Create the cache directory
 mkdir -p /var/lib/filepi/media/.cache
+chown root:root /var/lib/filepi/media/.cache
+chmod 755 /var/lib/filepi/media/.cache

Note: Adjust the ownership if the service runs as a different user.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
mkdir -p /var/lib/filepi/media/.cache
mkdir -p /var/lib/filepi/media/.cache
chown root:root /var/lib/filepi/media/.cache
chmod 755 /var/lib/filepi/media/.cache
🤖 Prompt for AI Agents
In debian/postinst around line 15, the script creates
/var/lib/filepi/media/.cache but does not set ownership or permissions; update
the postinst to create the directory and then set its owner to the service user
(e.g., chown filepi:filepi /var/lib/filepi/media/.cache) and set safe writable
permissions for the service (e.g., chmod 0755 or 0775 if a group needs write
access); adjust the user/group and mode if your service runs as a different user
or requires group write access.

Comment thread debian/postinst
Comment on lines +17 to +22
# Reload systemd to recognize the new service
systemctl daemon-reload

# Enable and start the service
systemctl enable filepi.service
systemctl start filepi.service || true

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add systemd availability check before calling systemctl.

The script calls systemctl without checking if systemd is available, which will fail in chroot environments during package builds or in containers.

Apply this diff to add a systemd check:

-        # Reload systemd to recognize the new service
-        systemctl daemon-reload
-
-        # Enable and start the service
-        systemctl enable filepi.service
-        systemctl start filepi.service || true
+        # Reload systemd to recognize the new service
+        if [ -d /run/systemd/system ]; then
+            systemctl daemon-reload
+            systemctl enable filepi.service
+            systemctl start filepi.service || true
+        fi
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
# Reload systemd to recognize the new service
systemctl daemon-reload
# Enable and start the service
systemctl enable filepi.service
systemctl start filepi.service || true
# Reload systemd to recognize the new service
if [ -d /run/systemd/system ]; then
systemctl daemon-reload
systemctl enable filepi.service
systemctl start filepi.service || true
fi
🤖 Prompt for AI Agents
In debian/postinst around lines 17 to 22, the script calls systemctl
unconditionally which fails in chroot/container builds; wrap the daemon-reload,
enable and start calls in a guard that checks for systemd availability (e.g.,
verify systemctl exists and that /run/systemd/system or similar runtime
indicator is present) and only run the systemctl commands inside that
conditional, preserving the existing fallback behavior for start (|| true) if
desired.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
.github/workflows/on-push-build-all.yml (1)

186-196: Glob pattern for deb rename could fail silently or match multiple files.

Line 193 uses mv outputs/filepi_*.deb filepi_... which could:

  • Fail silently if no .deb is found
  • Match multiple files unpredictably

Apply this diff to add explicit validation:

         # Rename the deb file to include architecture
-        mv outputs/filepi_*.deb filepi_${{ needs.setup.outputs.build-name }}_${{ matrix.arch }}.deb
+        DEB_FILE=$(find outputs -name "filepi_*.deb" -type f)
+        if [ -z "$DEB_FILE" ]; then
+          echo "ERROR: No .deb file found in outputs/"
+          exit 1
+        fi
+        mv "$DEB_FILE" filepi_${{ needs.setup.outputs.build-name }}_${{ matrix.arch }}.deb
🧹 Nitpick comments (4)
build.sh (1)

155-155: Simplify redundant binary copy with fallback.

Lines 155 and 164 contain duplicate cp commands with error suppression that doesn't add value. If the binary is expected in one location, copying with || true could mask real failures silently.

Consider simplifying to a single, strict copy that fails loudly on error:

-        # Copy binary to root for easier access
-        cp target/release/filepi ./filepi || cp target/release/filepi ./filepi 2>/dev/null || true
+        # Copy binary to root for easier access
+        cp target/release/filepi ./filepi

This ensures errors are caught early and the script output is clearer. If both locations need to be checked, use an explicit conditional instead.

Also applies to: 164-164

build-in-docker.sh (1)

5-9: Remove unused YELLOW variable.

Line 7 defines YELLOW but it's never used in the script output. Remove it to avoid confusion and pass shell linting.

 RED='\033[0;31m'
 GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
 BLUE='\033[0;34m'
 NC='\033[0m' # No Color
build-deb.sh (1)

84-98: Multiple sed operations could be consolidated for clarity.

Lines 84–98 perform several sequential sed operations to clean up debhelper placeholders. This could be consolidated into a single pass for better performance and readability:

-    # Remove debhelper variable placeholders
-    sed 's/${shlibs:Depends}, //g' "$CONTROL_FILE" > "$CONTROL_TMP"
-    mv "$CONTROL_TMP" "$CONTROL_FILE"
-
-    sed 's/${misc:Depends}, //g' "$CONTROL_FILE" > "$CONTROL_TMP"
-    mv "$CONTROL_TMP" "$CONTROL_FILE"
-
-    sed 's/${shlibs:Depends}//g' "$CONTROL_FILE" > "$CONTROL_TMP"
-    mv "$CONTROL_TMP" "$CONTROL_FILE"
-
-    sed 's/${misc:Depends}//g' "$CONTROL_FILE" > "$CONTROL_TMP"
-    mv "$CONTROL_TMP" "$CONTROL_FILE"
-
-    # Clean up any trailing commas or spaces in Depends
-    sed 's/Depends: , /Depends: /g' "$CONTROL_FILE" > "$CONTROL_TMP"
-    mv "$CONTROL_TMP" "$CONTROL_FILE"
+    # Remove debhelper variable placeholders and clean up
+    sed -E \
+      -e 's/\$\{shlibs:Depends\}, //g' \
+      -e 's/\$\{misc:Depends\}, //g' \
+      -e 's/\$\{shlibs:Depends\}//g' \
+      -e 's/\$\{misc:Depends\}//g' \
+      -e 's/Depends: , /Depends: /g' \
+      "$CONTROL_FILE" > "$CONTROL_TMP"
+    mv "$CONTROL_TMP" "$CONTROL_FILE"
.github/workflows/on-tag-push-create-release.yml (1)

154-162: Consider using bash parameter expansion instead of sed for filename transformation.

Lines 158 and 169 use sed to replace build numbers with tag names in filenames. This can be simplified using bash parameter expansion for better readability and performance:

         # Process binary tarballs
         for tarball in ${{ env.ARTIFACTS_DIR }}/*.tar.gz; do
           if [ -f "$tarball" ]; then
             filename=$(basename "$tarball")
-            # Replace the build name with tag name in filename
-            new_filename=$(echo "$filename" | sed "s/main_rs_[0-9]\+/${TAG_NAME}/g")
+            # Replace the build name with tag name in filename
+            new_filename="${filename//main_rs_[0-9]*/${TAG_NAME}}"
             cp "$tarball" "${{ env.RELEASE_DIR }}/${new_filename}"
             echo "Prepared: ${new_filename}"
           fi
         done

         # Process Debian packages
         for deb in ${{ env.ARTIFACTS_DIR }}/*.deb; do
           if [ -f "$deb" ]; then
             filename=$(basename "$deb")
-            # Replace the build name with tag name in filename
-            new_filename=$(echo "$filename" | sed "s/main_rs_[0-9]\+/${TAG_NAME}/g")
+            # Replace the build name with tag name in filename
+            new_filename="${filename//main_rs_[0-9]*/${TAG_NAME}}"
             cp "$deb" "${{ env.RELEASE_DIR }}/${new_filename}"
             echo "Prepared: ${new_filename}"
           fi
         done

Also applies to: 164-173

📜 Review details

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between b38c617 and 20843d4.

📒 Files selected for processing (18)
  • .dockerignore (1 hunks)
  • .github/workflows/on-push-build-all.yml (1 hunks)
  • .github/workflows/on-tag-push-create-release.yml (1 hunks)
  • .gitignore (1 hunks)
  • Dockerfile (1 hunks)
  • README.md (1 hunks)
  • build-deb.sh (1 hunks)
  • build-in-docker.sh (1 hunks)
  • build.ps1 (1 hunks)
  • build.sh (6 hunks)
  • debian/changelog (1 hunks)
  • debian/control (1 hunks)
  • debian/filepi.service (1 hunks)
  • debian/postinst (1 hunks)
  • debian/postrm (1 hunks)
  • debian/rules (1 hunks)
  • docs/DEBIAN-INSTALL.md (1 hunks)
  • frontend/FilePiWeb/Layout/EmptyLayout.razor (1 hunks)
✅ Files skipped from review due to trivial changes (3)
  • build.ps1
  • debian/postrm
  • frontend/FilePiWeb/Layout/EmptyLayout.razor
🚧 Files skipped from review as they are similar to previous changes (9)
  • Dockerfile
  • debian/control
  • debian/changelog
  • .gitignore
  • debian/rules
  • .dockerignore
  • debian/filepi.service
  • debian/postinst
  • docs/DEBIAN-INSTALL.md
🧰 Additional context used
🧬 Code graph analysis (1)
build.sh (1)
build-in-docker.sh (3)
  • print_error (19-21)
  • print_step (11-13)
  • print_success (15-17)
🪛 actionlint (1.7.9)
.github/workflows/on-push-build-all.yml

25-25: shellcheck reported issue in this script: SC2086:info:18:31: Double quote to prevent globbing and word splitting

(shellcheck)


25-25: shellcheck reported issue in this script: SC2086:info:19:28: Double quote to prevent globbing and word splitting

(shellcheck)


25-25: shellcheck reported issue in this script: SC2086:info:20:36: Double quote to prevent globbing and word splitting

(shellcheck)


25-25: shellcheck reported issue in this script: SC2129:style:18:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)


222-222: shellcheck reported issue in this script: SC2012:info:18:12: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


222-222: shellcheck reported issue in this script: SC2012:info:9:12: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


222-222: shellcheck reported issue in this script: SC2086:info:10:35: Double quote to prevent globbing and word splitting

(shellcheck)


222-222: shellcheck reported issue in this script: SC2086:info:13:12: Double quote to prevent globbing and word splitting

(shellcheck)


222-222: shellcheck reported issue in this script: SC2086:info:14:34: Double quote to prevent globbing and word splitting

(shellcheck)


222-222: shellcheck reported issue in this script: SC2086:info:19:35: Double quote to prevent globbing and word splitting

(shellcheck)


222-222: shellcheck reported issue in this script: SC2086:info:1:30: Double quote to prevent globbing and word splitting

(shellcheck)


222-222: shellcheck reported issue in this script: SC2086:info:2:12: Double quote to prevent globbing and word splitting

(shellcheck)


222-222: shellcheck reported issue in this script: SC2086:info:3:54: Double quote to prevent globbing and word splitting

(shellcheck)


222-222: shellcheck reported issue in this script: SC2086:info:4:12: Double quote to prevent globbing and word splitting

(shellcheck)


222-222: shellcheck reported issue in this script: SC2086:info:5:61: Double quote to prevent globbing and word splitting

(shellcheck)


222-222: shellcheck reported issue in this script: SC2129:style:1:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)

.github/workflows/on-tag-push-create-release.yml

130-130: shellcheck reported issue in this script: SC2001:style:28:20: See if you can use ${variable//search/replace} instead

(shellcheck)


130-130: shellcheck reported issue in this script: SC2001:style:39:20: See if you can use ${variable//search/replace} instead

(shellcheck)


277-277: shellcheck reported issue in this script: SC2012:info:12:13: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


277-277: shellcheck reported issue in this script: SC2012:info:4:17: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


318-318: shellcheck reported issue in this script: SC2012:info:12:12: Use find instead of ls to better handle non-alphanumeric filenames

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:14:61: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:16:56: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:1:60: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:20:12: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:21:31: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:22:50: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:23:49: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:24:47: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:25:40: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:26:42: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:2:12: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:3:65: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:4:72: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:5:117: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:6:96: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:7:12: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2086:info:8:33: Double quote to prevent globbing and word splitting

(shellcheck)


318-318: shellcheck reported issue in this script: SC2129:style:1:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)


318-318: shellcheck reported issue in this script: SC2129:style:20:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)

🪛 markdownlint-cli2 (0.18.1)
README.md

14-14: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


21-21: Heading levels should only increment by one level at a time
Expected: h3; Actual: h4

(MD001, heading-increment)


21-21: Headings must start at the beginning of the line

(MD023, heading-start-left)


27-27: Headings must start at the beginning of the line

(MD023, heading-start-left)

🪛 Shellcheck (0.11.0)
build-in-docker.sh

[warning] 7-7: YELLOW appears unused. Verify use (or export if used externally).

(SC2034)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build Blazor Frontend
🔇 Additional comments (5)
build-in-docker.sh (1)

58-87: Comprehensive prerequisites and helpful output.

The Docker packaging script does a good job validating that both the filepi binary and webdeploy directory exist before attempting the build, with clear error messages guiding the user to the correct build commands. The user ID preservation (-u flag) and final verification command example are solid touches for a containerized workflow.

.github/workflows/on-push-build-all.yml (1)

110-128: Binary name and artifact handling look correct.

Line 118 correctly references the filepi binary (not filepi-rust), matching the Cargo.toml binary name. The cross-compilation setup and target-specific linking environment variable are properly configured for arm64 builds.

build-deb.sh (1)

28-40: Solid prerequisite validation and version normalization.

The script properly validates that both the filepi binary and webdeploy directory exist before proceeding, with clear error guidance. Version normalization (underscore-to-hyphen conversion at line 18) ensures Debian package naming compliance. The package structure creation and control file processing handle standard Debian metadata correctly.

.github/workflows/on-tag-push-create-release.yml (2)

276-309: Excellent defensive design with explicit verification and fail-fast behavior.

The workflow includes comprehensive checks:

  • Explicit verification step (lines 276–296) counts tarballs and .deb files, failing if counts are zero
  • fail_on_unmatched_files: true at line 309 ensures the release action fails if asset patterns don't match
  • This dual-layer validation prevents silent failures and ensures release integrity

200-274: Well-structured release notes with comprehensive user guidance.

The generated release notes include feature highlights, quick-start instructions for both Debian packages and binary installations, documentation links, and architecture information. The formatting is clear and user-friendly, with appropriate emoji for visual scanning.

Comment thread README.md
Comment on lines +12 to +30
* **.Net Libman**

* Install .Net Libman
```bash
dotnet tool install --global dotnet-libman
```

* **FFmpeg**

#### On Raspberry Pi / Debian / Ubuntu:
```bash
sudo apt update
sudo apt install ffmpeg
```

#### On macOS:
```bash
brew install ffmpeg
```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix Markdown formatting issues to pass linting.

Several formatting violations are present:

  1. Line 14: List item indentation should be 2 spaces, not 4 (MD007).
  2. Lines 21 and 27: Headings should increment by one level (should be h3 ### not h4 #### under h2 section) (MD001).
  3. Lines 21 and 27: Headings must start at column 0, not indented with spaces (MD023).

Apply this diff to fix:

-* **.Net Libman**
+* **.NET LibMan**

-    * Install .Net Libman
+    * Install .NET LibMan
     ```bash
     dotnet tool install --global dotnet-libman
     ```

-* **FFmpeg**
+* **FFmpeg**

-    #### On Raspberry Pi / Debian / Ubuntu:
+    ### On Raspberry Pi / Debian / Ubuntu:
     ```bash
     sudo apt update
     sudo apt install ffmpeg
     ```

-    #### On macOS:
+    ### On macOS:
     ```bash
     brew install ffmpeg
     ```
🧰 Tools
🪛 markdownlint-cli2 (0.18.1)

14-14: Unordered list indentation
Expected: 2; Actual: 4

(MD007, ul-indent)


21-21: Heading levels should only increment by one level at a time
Expected: h3; Actual: h4

(MD001, heading-increment)


21-21: Headings must start at the beginning of the line

(MD023, heading-start-left)


27-27: Headings must start at the beginning of the line

(MD023, heading-start-left)

🤖 Prompt for AI Agents
In README.md around lines 12 to 30, fix Markdown lint issues by changing the
".Net Libman" sub-list item indentation from 4 spaces to 2 spaces, and change
the two indented level-4 headings ("#### On Raspberry Pi / Debian / Ubuntu:" and
"#### On macOS:") to level-3 headings ("### ...") and remove their leading
spaces so each heading starts at column 0; ensure code fences remain intact
after these edits.

@renjuashokan
renjuashokan merged commit 5322415 into main_rs Nov 30, 2025
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant