Skip to content

feat: Comprehensive demo polish — login, dashboard, CSS fixes, CI/CD with APK - #11

Merged
enerBydev merged 2 commits into
mainfrom
fix/comprehensive-demo-polish
Jun 16, 2026
Merged

feat: Comprehensive demo polish — login, dashboard, CSS fixes, CI/CD with APK#11
enerBydev merged 2 commits into
mainfrom
fix/comprehensive-demo-polish

Conversation

@enerBydev

@enerBydev enerBydev commented Jun 16, 2026

Copy link
Copy Markdown
Owner

Changes

New Features

  • Login page: Demo login (click to enter dashboard, no auth required)
  • Dashboard page: Sidebar navigation + stats cards + quick actions + profile
  • Iniciar Sesion button in navbar
  • Android APK build in GitHub Actions release workflow
  • GitHub Release creation with all artifacts (backend, WASM, APK)

CSS Fixes

  • Hover/focus/active states for all interactive elements
  • Hide API endpoint text from production UI
  • Hide TODO M2 badges from production UI
  • Add @Keyframes spin animation for WASM loading spinner
  • Improve footer contrast and accessibility
  • Add focus-visible outlines for keyboard navigation
  • Add empty state styles with icons
  • Add login + dashboard responsive breakpoints

Bug Fixes

  • Fix backend main.rs formatting (rustfmt compliance for CI)
  • Fix CI failure: cargo fmt --check now passes

Documentation

  • Update README with Helder 10-point checklist coverage
  • Document demo/placeholder boundaries clearly
  • Document reusable vs demo code clearly

Addresses

  • Client Helder review checklist items 1-10
  • Previous QA audit findings (28 visual bugs)
  • CI/CD pipeline failures
  • Android APK requirement

Summary by CodeRabbit

  • New Features

    • Added login page with "Iniciar Sesión" button navigating to dashboard
    • Added dashboard with four sections: overview, routes, matches, and profile
    • Added logout functionality in dashboard
    • Added Android APK option to demo documentation
    • Added WASM loading spinner state
  • Style

    • Enhanced UI styling for focus, active, and disabled states across buttons and form components
    • Added responsive styling for dashboard and login layouts

…with APK

- Add Login page (demo: click to enter dashboard, no auth required)
- Add Dashboard page (sidebar + stats + quick actions + profile)
- Add 'Iniciar Sesion' button in navbar
- Fix CSS: hover/focus/active states for all interactive elements
- Fix CSS: hide API endpoint text (.form-note display:none)
- Fix CSS: hide TODO M2 badges from production UI
- Fix CSS: add @Keyframes spin animation for WASM loading
- Fix CSS: improve footer contrast and accessibility
- Fix CSS: add focus-visible outlines for keyboard navigation
- Fix CSS: add empty state styles with icons
- Fix CSS: add login + dashboard responsive breakpoints
- Fix backend main.rs formatting (rustfmt compliance for CI)
- Update CI workflow (unchanged)
- Add Android APK build job to release workflow
- Add GitHub Release creation with all artifacts
- Update README with Helder's 10-point checklist coverage
- Document demo/placeholder boundaries clearly
- Document reusable vs demo code clearly
@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@enerBydev, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 54 minutes and 1 second. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: c1a94a63-f2d2-4893-ad01-a46fdd61abfb

📥 Commits

Reviewing files that changed from the base of the PR and between 59b0586 and 99075b0.

📒 Files selected for processing (2)
  • crates/backend/src/integration_tests.rs
  • crates/backend/src/routes.rs
📝 Walkthrough

Walkthrough

Adds Login and Dashboard page variants to the Dioxus frontend with full-screen routing, new LoginPage and DashboardPage components, a navbar login button, and ~700 lines of CSS covering login card, dashboard sidebar/sections, interaction states, WASM loading spinner, and responsive rules. The CI WASM build job gains a step that generates dist/index.html before artifact upload. Backend tracing filter setup and TCP bind are reformatted. README is updated with Android APK docs and demo table revisions.

Changes

Login & Dashboard Frontend Feature

Layer / File(s) Summary
Page enum variants and App routing
crates/frontend/src/main.rs, crates/frontend/src/components/mod.rs
Adds Login and Dashboard variants to Page and updates App to render LoginPage/DashboardPage full-screen (bypassing navbar/footer) when those variants are active; exports the new components from the module.
LoginPage component
crates/frontend/src/components/login.rs
New LoginPage Dioxus component renders a centered login-card with an "Iniciar Sesión" button that calls on_navigate(Page::Dashboard).
DashboardPage component
crates/frontend/src/components/dashboard.rs
New DashboardPage component with active_section signal, sidebar tab navigation (Resumen/Mis Rutas/Matching/Perfil), logout action, and four conditional main-area sections including stats, empty-states, and a demo profile card.
Navbar login button
crates/frontend/src/components/navbar.rs
Adds an "Iniciar Sesión" button to the navbar right side and mobile menu, both wired to navigate to Page::Login.
CSS for login/dashboard, interactions, and WASM spinner
crates/frontend/assets/main.css
Adds global :focus-visible ring, active/disabled states for all CTA and button components, hides .form-note and placeholder badges, updates footer colors, introduces WASM loading spinner, and adds full login card and dashboard layout blocks (sidebar, stats, profile) with responsive rules for 768px and larger breakpoints.

WASM CI Artifact, Docs, and Backend Cleanup

Layer / File(s) Summary
CI WASM index.html generation and artifact upload
.github/workflows/release.yml
Inserts a build-wasm job step that writes dist/index.html via heredoc (inline CSS loading UI + WASM module init script); artifact upload runs after this step to include the new HTML file.
README updates and backend minor reformatting
README.md, crates/backend/src/main.rs
README adds Android APK demo URLs, "Opción 4" build section, reorders endpoints, and revises placeholder table entries. Backend rewrites EnvFilter construction using from_default_env() and reformats TCP bind to multi-line.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant Navbar
    participant App
    participant LoginPage
    participant DashboardPage

    User->>Navbar: clicks "Iniciar Sesión"
    Navbar->>App: on_navigate(Page::Login)
    App->>LoginPage: render full-screen (no navbar/footer)
    User->>LoginPage: clicks "Iniciar Sesión" button
    LoginPage->>App: on_navigate(Page::Dashboard)
    App->>DashboardPage: render full-screen (no navbar/footer)
    User->>DashboardPage: clicks sidebar tab or quick-action
    DashboardPage->>App: on_navigate(Page::Driver / Page::Passenger)
    User->>DashboardPage: clicks logout
    DashboardPage->>App: on_navigate(Page::Home)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🐇 A login card blooms on the screen so bright,
A dashboard with sidebar tabs, left and right.
The WASM loads with a spinner that spins,
A dist/index.html is where demo begins.
Hop along, dear user, the routes await —
This rabbit has opened the frontend gate! 🌟

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: adding login/dashboard UI components, CSS styling improvements, and CI/CD enhancements with Android APK support.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/comprehensive-demo-polish

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: 6

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/release.yml:
- Line 122: Replace all third-party GitHub Actions references in the release.yml
file that currently use version tags with their full commit SHA equivalents. For
each action (actions/checkout, dtolnay/rust-toolchain, actions/upload-artifact,
actions/setup-java, android-actions/setup-android, actions/download-artifact,
and softprops/action-gh-release), update the `uses:` directive from the current
tag format (e.g., `@v4`) to the immutable full commit SHA format to prevent
supply-chain vulnerabilities. Ensure every `uses:` statement across all workflow
jobs uses a pinned commit SHA instead of a floating tag reference.
- Line 122: Add `persist-credentials: false` to all four instances of the
`actions/checkout@v4` step in the workflow to prevent Git credentials from
persisting in the local Git config. Since this workflow does not perform any
authenticated Git operations after checkout, this change follows the principle
of least privilege and reduces credential exposure risk. Locate each checkout
step using the actions/checkout@v4 identifier and add the with clause containing
persist-credentials: false to each one.
- Around line 190-194: The glob pattern in the files section for the
pickando-frontend-wasm artifacts uses `artifacts/pickando-frontend-wasm/*` which
only matches top-level files and excludes the `assets/` subdirectory containing
critical files like pickando.js, pickando_bg.wasm, and main.css. Change this
pattern to use a recursive glob pattern (e.g.,
`artifacts/pickando-frontend-wasm/**/*` or
`artifacts/pickando-frontend-wasm/**`) to include all files and subdirectories
in the release artifacts.
- Around line 117-177: Add explicit least-privilege permissions to the workflow
to follow security best practices. At the workflow root level (before the jobs
section), define a global permissions block with minimal permissions (typically
read-only access like contents: read). Then, in the create-release job which
needs to create GitHub releases, override with elevated permissions by adding a
permissions block to that specific job with the necessary permissions (such as
contents: write) to perform release operations. This ensures all jobs start with
minimal permissions and only the create-release job has the elevated access it
requires.

In `@crates/frontend/src/components/dashboard.rs`:
- Around line 43-44: Spanish UI text strings in the dashboard component are
missing proper diacritical marks, reducing copy quality. Locate and update all
Spanish language strings to include correct accents: "Cerrar Sesion" should be
"Cerrar Sesión", "Aqui" should be "Aquí", "direccion" should be "dirección",
"todavia" should be "todavía", "Calificacion" should be "Calificación",
"informacion" should be "información", "estadisticas" should be "estadísticas",
and "ubicacion" should be "ubicación". Search the entire dashboard component for
these misspelled strings and replace them with their correctly accented Spanish
equivalents.
- Around line 14-17: The sidebar-brand div element is styled to appear clickable
with cursor: pointer but lacks actual interactivity and keyboard accessibility.
Convert the div with class "sidebar-brand" containing the brand-icon span and
"Pickando" text into a semantic interactive element (such as a button or link)
with proper on_navigate event handling to navigate to Page::Home, or
alternatively remove the cursor: pointer styling from the CSS if the element
should remain non-interactive. This ensures the visual presentation matches the
actual functionality and provides proper keyboard navigation support.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 5e252c25-a104-45cf-b9a4-0362fe95b642

📥 Commits

Reviewing files that changed from the base of the PR and between 41fa7e7 and 59b0586.

📒 Files selected for processing (9)
  • .github/workflows/release.yml
  • README.md
  • crates/backend/src/main.rs
  • crates/frontend/assets/main.css
  • crates/frontend/src/components/dashboard.rs
  • crates/frontend/src/components/login.rs
  • crates/frontend/src/components/mod.rs
  • crates/frontend/src/components/navbar.rs
  • crates/frontend/src/main.rs

Comment on lines +117 to +177
build-android:
name: Android APK
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Install Android targets
run: |
rustup target add aarch64-linux-android
rustup target add armv7-linux-androideabi
rustup target add x86_64-linux-android

- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '17'

- name: Setup Android SDK
uses: android-actions/setup-android@v3

- name: Install Android NDK
run: |
sdkmanager --install "ndk;27.0.12077973"
echo "ANDROID_NDK_HOME=$ANDROID_HOME/ndk/27.0.12077973" >> $GITHUB_ENV

- name: Install cargo-ndk
run: cargo install cargo-ndk

- name: Build Android native libraries
run: |
cargo ndk -t arm64-v8a -t armeabi-v7a -t x86_64 build --release -p pickando-frontend --features mobile
env:
ANDROID_NDK_HOME: ${{ env.ANDROID_NDK_HOME }}

- name: Install Dioxus CLI
run: cargo install dioxus-cli --version 0.7.9

- name: Initialize Android project
working-directory: crates/frontend
run: dx android init

- name: Build Android APK
working-directory: crates/frontend
run: dx android build --release

- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: pickando-android-apk
path: crates/frontend/target/android/app/release/app-release.apk

create-release:
name: Create GitHub Release
needs: [build-backend, build-wasm, build-android]
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')

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

🧩 Analysis chain

🏁 Script executed:

cat -n .github/workflows/release.yml

Repository: enerBydev/pickando-demo

Length of output: 8714


🌐 Web query:

GitHub Actions upload-artifact download-artifact permissions required scope

💡 Result:

When using GitHub Actions, the permissions required for actions/upload-artifact and actions/download-artifact depend on the scope of the operation [1][2][3]. For standard usage within the same workflow run, no explicit additional permissions or tokens are required beyond the default GITHUB_TOKEN permissions [1][3]. If you need to download artifacts from other workflow runs or other repositories, the action requires elevated permissions [1][2][3]. In these scenarios, you must provide a github-token (such as a Personal Access Token or a token with appropriate scope) that possesses actions:read permissions for the target repository [1][3]. When configuring this for cross-repository or cross-run downloads, you specify the token alongside the repository name and the run ID [1][3]: - uses: actions/download-artifact@v8 with: name: my-other-artifact github-token: ${{ secrets.GH_PAT }} repository: owner/repo-name run-id: 1234 Please note that file permissions (such as executable bits) are not preserved during the standard artifact upload process, as zipping files resets directory permissions to 755 and file permissions to 644 [1][4]. If preserving specific file permissions is required, it is recommended to archive your files using tar before uploading [1][3][4].

Citations:


🌐 Web query:

softprops action-gh-release permissions contents:write requirement

💡 Result:

The softprops/action-gh-release action requires the contents: write permission to function correctly [1][2][3]. This permission allows the action to create, update, and upload assets to GitHub Releases [1][4]. If you use the optional discussion_category_name input, you must also grant the discussions: write permission [1][2][5]: permissions: contents: write discussions: write Important Considerations: - Permission Scope: These permissions can be defined at the job level or the workflow level [1][2]. Be aware that defining an explicit permissions block in your workflow overrides the default permissions, so ensure you include any other necessary permissions if your workflow performs other tasks [6]. - Repository Settings: In addition to the workflow-level configuration, ensure your repository's GitHub Actions settings permit the GITHUB_TOKEN to have read and write access (check Settings > Actions > General > Workflow permissions) [6]. - Release Events: If you are triggering your workflow on the release: { types: [published] } event, the default GITHUB_TOKEN will not trigger a subsequent workflow. In this specific scenario, you must use a personal access token (PAT) instead of the default token [1][2][3].

Citations:


Add explicit least-privilege permissions for GITHUB_TOKEN.

This workflow currently relies on default token permissions. Define minimal permissions globally and elevate only where needed (release job).

Proposed hardening
+permissions:
+  contents: read
+
 jobs:
   build-backend:
@@
   create-release:
+    permissions:
+      contents: write
     name: Create GitHub Release
🧰 Tools
🪛 zizmor (1.25.2)

[warning] 122-122: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[warning] 117-171: overly broad permissions (excessive-permissions): default permissions used due to no permissions: block

(excessive-permissions)


[error] 122-122: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 125-125: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 134-134: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 140-140: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)


[error] 168-168: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 117 - 177, Add explicit
least-privilege permissions to the workflow to follow security best practices.
At the workflow root level (before the jobs section), define a global
permissions block with minimal permissions (typically read-only access like
contents: read). Then, in the create-release job which needs to create GitHub
releases, override with elevated permissions by adding a permissions block to
that specific job with the necessary permissions (such as contents: write) to
perform release operations. This ensures all jobs start with minimal permissions
and only the create-release job has the elevated access it requires.

Source: Linters/SAST tools

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

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

🧩 Analysis chain

🏁 Script executed:

cat -n .github/workflows/release.yml | grep -A 2 -B 2 "uses:"

Repository: enerBydev/pickando-demo

Length of output: 1878


Pin all third-party GitHub Actions to full commit SHAs instead of version tags.

Using tag refs (@v4, @v3, @v2, @stable, etc.) leaves the workflow vulnerable to upstream tag retargeting and supply-chain drift attacks. Pin every uses: reference to an immutable commit SHA.

This applies to multiple actions throughout the file:

  • Line 16, 35, 122, 180: actions/checkout
  • Line 19, 38, 125: dtolnay/rust-toolchain
  • Line 25, 112, 168: actions/upload-artifact
  • Line 134: actions/setup-java
  • Line 140: android-actions/setup-android
  • Line 183: actions/download-artifact
  • Line 188: softprops/action-gh-release
🧰 Tools
🪛 zizmor (1.25.2)

[warning] 122-122: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[error] 122-122: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml at line 122, Replace all third-party GitHub
Actions references in the release.yml file that currently use version tags with
their full commit SHA equivalents. For each action (actions/checkout,
dtolnay/rust-toolchain, actions/upload-artifact, actions/setup-java,
android-actions/setup-android, actions/download-artifact, and
softprops/action-gh-release), update the `uses:` directive from the current tag
format (e.g., `@v4`) to the immutable full commit SHA format to prevent
supply-chain vulnerabilities. Ensure every `uses:` statement across all workflow
jobs uses a pinned commit SHA instead of a floating tag reference.

Source: Linters/SAST tools


⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cat -n .github/workflows/release.yml | sed -n '110,135p'

Repository: enerBydev/pickando-demo

Length of output: 878


🏁 Script executed:

cat -n .github/workflows/release.yml | sed -n '170,190p'

Repository: enerBydev/pickando-demo

Length of output: 779


🏁 Script executed:

cat -n .github/workflows/release.yml | head -50

Repository: enerBydev/pickando-demo

Length of output: 1605


🏁 Script executed:

cat -n .github/workflows/release.yml | tail -20

Repository: enerBydev/pickando-demo

Length of output: 1108


🏁 Script executed:

wc -l .github/workflows/release.yml

Repository: enerBydev/pickando-demo

Length of output: 101


🏁 Script executed:

cat -n .github/workflows/release.yml | sed -n '1,207p' | grep -E '(checkout|run:|git|push|token)'

Repository: enerBydev/pickando-demo

Length of output: 836


🌐 Web query:

persist-credentials false GitHub Actions checkout security best practice

💡 Result:

In GitHub Actions, setting persist-credentials to false is considered a security best practice when you do not need to perform authenticated Git operations (such as git push) during your workflow [1][2]. The actions/checkout action defaults to true for the persist-credentials input [3][4]. When enabled, this action configures the local Git environment with the GITHUB_TOKEN (or provided SSH key) [3][2]. While newer versions of actions/checkout have improved security by storing these credentials in a separate file under $RUNNER_TEMP instead of directly in.git/config, keeping them persisted still allows any subsequent steps or third-party actions in the same job to potentially access and use these credentials [3][2][5]. By explicitly setting persist-credentials: false, you prevent the action from configuring Git with these credentials, which follows the principle of least privilege and reduces the risk of credential exposure if a workflow step is compromised [1][2]. Example of the recommended configuration: - uses: actions/checkout@v4 with: persist-credentials: false You should only omit this setting or set it to true if your workflow explicitly requires running authenticated Git commands, such as pushing commits back to your repository [2].

Citations:


Apply persist-credentials: false to all checkout steps.

This workflow does not perform authenticated Git operations after checkout, so credentials should not be persisted in the local Git config. Setting persist-credentials: false follows the principle of least privilege and reduces the risk of credential exposure if a workflow step is compromised (per OWASP GitHub Actions Security Cheat Sheet).

Suggested patch
       - uses: actions/checkout@v4
+        with:
+          persist-credentials: false

This applies to all four checkout steps in the workflow: lines 16, 35, 122, and 180.

📝 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
- uses: actions/checkout@v4
- uses: actions/checkout@v4
with:
persist-credentials: false
🧰 Tools
🪛 zizmor (1.25.2)

[warning] 122-122: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)


[error] 122-122: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml at line 122, Add `persist-credentials: false`
to all four instances of the `actions/checkout@v4` step in the workflow to
prevent Git credentials from persisting in the local Git config. Since this
workflow does not perform any authenticated Git operations after checkout, this
change follows the principle of least privilege and reduces credential exposure
risk. Locate each checkout step using the actions/checkout@v4 identifier and add
the with clause containing persist-credentials: false to each one.

Source: Linters/SAST tools

Comment on lines +190 to +194
files: |
artifacts/pickando-backend-linux/pickando-backend
artifacts/pickando-android-apk/app-release.apk
artifacts/pickando-frontend-wasm/*
body: |

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

🧩 Analysis chain

🏁 Script executed:

cat .github/workflows/release.yml | head -n 200 | tail -n 30

Repository: enerBydev/pickando-demo

Length of output: 1048


🏁 Script executed:

# Let's also check if there are any WASM artifacts to understand the directory structure
fd pickando-frontend-wasm -type d 2>/dev/null || echo "No WASM directory found in repo (expected, as artifacts are generated)"

Repository: enerBydev/pickando-demo

Length of output: 138


🏁 Script executed:

# Check the GitHub Actions documentation for glob pattern behavior
# by examining the workflow file more carefully
rg -A 20 'files:' .github/workflows/release.yml | head -n 40

Repository: enerBydev/pickando-demo

Length of output: 909


🌐 Web query:

softprops/action-gh-release glob pattern matching behavior documentation

💡 Result:

The softprops/action-gh-release action uses glob pattern matching to identify files for release [1][2]. Its behavior and usage are documented as follows: Core Glob Behavior The files input accepts a newline-delimited list of glob expressions [1][3]. Patterns are resolved against the working_directory if provided; otherwise, they are resolved relative to the ${{ github.workspace }} directory [1][4]. Platform-Specific Considerations On Windows runners, the action accepts both forward slash (/) and backslash () as path separators in glob patterns [1][3]. It is recommended to use forward slashes for cross-platform consistency [5]. Handling Special Characters Because the files input is glob-based, filenames containing glob metacharacters (such as [ or ]) must be escaped in the pattern to be matched literally [1][2]. Home Directory Expansion The action supports the use of ~/ at the start of a pattern, which is expanded to the runner's home directory [1][3]. Unmatched Files If the fail_on_unmatched_files option is enabled, the action will fail if any provided glob pattern does not match at least one file [1][6]. Technical Implementation The action uses the Node.js glob library [7]. The working_directory support (introduced in v2.4.0) ensures that glob resolution, including the identification of unmatched patterns, correctly respects the specified base directory [7][4].

Citations:


🏁 Script executed:

# Check the actual build steps to see what files are generated in the WASM directory
rg -B 5 -A 5 'pickando-frontend-wasm' .github/workflows/release.yml

Repository: enerBydev/pickando-demo

Length of output: 1209


🏁 Script executed:

# Let's look at the complete workflow to see how the WASM artifact is generated
rg -B 10 -A 10 'build-wasm' .github/workflows/release.yml | head -n 50

Repository: enerBydev/pickando-demo

Length of output: 1130


🏁 Script executed:

# Check what's in the dist directory that gets uploaded as WASM artifact
rg -B 5 -A 15 'name: Build WASM' .github/workflows/release.yml

Repository: enerBydev/pickando-demo

Length of output: 49


🏁 Script executed:

# Search for any references to assets directory in the WASM build
rg 'assets' .github/workflows/release.yml

Repository: enerBydev/pickando-demo

Length of output: 433


🏁 Script executed:

# Look at the frontend build configuration to understand output structure
find . -name 'Dioxus.toml' -o -name 'dioxus.toml' 2>/dev/null | head -5

Repository: enerBydev/pickando-demo

Length of output: 97


🏁 Script executed:

# Check the complete WASM build step to see the full output structure
rg -B 2 -A 20 'Upload WASM artifacts' .github/workflows/release.yml

Repository: enerBydev/pickando-demo

Length of output: 638


🏁 Script executed:

# Look for index.html or other root files in the dist directory creation
rg 'dist/' .github/workflows/release.yml -B 2 -A 2

Repository: enerBydev/pickando-demo

Length of output: 753


🏁 Script executed:

# Check Dioxus build output configuration
cat ./crates/frontend/Dioxus.toml

Repository: enerBydev/pickando-demo

Length of output: 444


Use a recursive WASM artifact glob in release files.

The pattern artifacts/pickando-frontend-wasm/* matches only top-level files (like index.html) but excludes files in the assets/ subdirectory. Since the build generates critical files—assets/pickando.js, assets/pickando_bg.wasm, and assets/main.css—these will be missing from the release. Use the recursive pattern to include all files:

Safer file pattern
           files: |
             artifacts/pickando-backend-linux/pickando-backend
             artifacts/pickando-android-apk/app-release.apk
-            artifacts/pickando-frontend-wasm/*
+            artifacts/pickando-frontend-wasm/**/*
📝 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
files: |
artifacts/pickando-backend-linux/pickando-backend
artifacts/pickando-android-apk/app-release.apk
artifacts/pickando-frontend-wasm/*
body: |
files: |
artifacts/pickando-backend-linux/pickando-backend
artifacts/pickando-android-apk/app-release.apk
artifacts/pickando-frontend-wasm/**/*
body: |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/release.yml around lines 190 - 194, The glob pattern in
the files section for the pickando-frontend-wasm artifacts uses
`artifacts/pickando-frontend-wasm/*` which only matches top-level files and
excludes the `assets/` subdirectory containing critical files like pickando.js,
pickando_bg.wasm, and main.css. Change this pattern to use a recursive glob
pattern (e.g., `artifacts/pickando-frontend-wasm/**/*` or
`artifacts/pickando-frontend-wasm/**`) to include all files and subdirectories
in the release artifacts.

Comment on lines +14 to +17
div { class: "sidebar-brand",
span { class: "brand-icon", "P" }
span { "Pickando" }
}

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 | ⚡ Quick win

Make the sidebar brand truly interactive (or non-clickable).

At Line 14-17, sidebar-brand is a plain div, but it’s styled as clickable in CSS (cursor: pointer), which is misleading and not keyboard-accessible. Use a semantic button/link with on_navigate.call(Page::Home), or remove clickable styling.

Suggested fix
-                div { class: "sidebar-brand",
+                button {
+                    class: "sidebar-brand",
+                    onclick: move |_| on_navigate.call(Page::Home),
                     span { class: "brand-icon", "P" }
                     span { "Pickando" }
                 }
📝 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
div { class: "sidebar-brand",
span { class: "brand-icon", "P" }
span { "Pickando" }
}
button {
class: "sidebar-brand",
onclick: move |_| on_navigate.call(Page::Home),
span { class: "brand-icon", "P" }
span { "Pickando" }
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/frontend/src/components/dashboard.rs` around lines 14 - 17, The
sidebar-brand div element is styled to appear clickable with cursor: pointer but
lacks actual interactivity and keyboard accessibility. Convert the div with
class "sidebar-brand" containing the brand-icon span and "Pickando" text into a
semantic interactive element (such as a button or link) with proper on_navigate
event handling to navigate to Page::Home, or alternatively remove the cursor:
pointer styling from the CSS if the element should remain non-interactive. This
ensures the visual presentation matches the actual functionality and provides
proper keyboard navigation support.

Comment on lines +43 to +44
"Cerrar Sesion"
}

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 | ⚡ Quick win

Normalize Spanish copy accents for production UI text.

Several visible strings are missing diacritics (e.g., “Sesion”, “Aqui”, “direccion”, “todavia”, “Calificacion”, “informacion”, “estadisticas”, “ubicacion”). This creates inconsistent UX copy quality.

Also applies to: 54-55, 98-99, 108-109, 155-156, 174-175, 189-190

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@crates/frontend/src/components/dashboard.rs` around lines 43 - 44, Spanish UI
text strings in the dashboard component are missing proper diacritical marks,
reducing copy quality. Locate and update all Spanish language strings to include
correct accents: "Cerrar Sesion" should be "Cerrar Sesión", "Aqui" should be
"Aquí", "direccion" should be "dirección", "todavia" should be "todavía",
"Calificacion" should be "Calificación", "informacion" should be "información",
"estadisticas" should be "estadísticas", and "ubicacion" should be "ubicación".
Search the entire dashboard component for these misspelled strings and replace
them with their correctly accented Spanish equivalents.

@enerBydev
enerBydev merged commit b57a319 into main Jun 16, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant