Skip to content

Make Android APK downloads use dynamic GitHub release URLs#264

Merged
AnthonyRonning merged 1 commit intomasterfrom
dynamic-android-apk-downloads
Oct 13, 2025
Merged

Make Android APK downloads use dynamic GitHub release URLs#264
AnthonyRonning merged 1 commit intomasterfrom
dynamic-android-apk-downloads

Conversation

@AnthonyRonning
Copy link
Copy Markdown
Contributor

@AnthonyRonning AnthonyRonning commented Oct 13, 2025

Replace hardcoded APK download link with dynamic URL fetching similar to desktop downloads. This ensures the download page always points to the latest APK release.

Summary by CodeRabbit

  • New Features
    • Added an Android APK download option to the Downloads page, enabling direct APK downloads for Android beta releases when available.
    • The download link automatically appears when release information includes an APK, with graceful fallback behavior to ensure a consistent experience.

Replace hardcoded APK download link with dynamic URL fetching similar to desktop downloads. This ensures the download page always points to the latest APK release.

Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Oct 13, 2025

Walkthrough

Adds an androidApk URL to download types and plumbing. Extends FALLBACK_URLS and UI in downloads.tsx to surface an Android beta APK link. Updates githubRelease.ts to populate androidApk in DownloadInfo based on release data.

Changes

Cohort / File(s) Summary
Downloads page & types
frontend/src/routes/downloads.tsx
Adds androidApk to DownloadUrls, extends FALLBACK_URLS, and wires the Android beta APK link to downloadUrls.androidApk.
Release utils & types
frontend/src/utils/githubRelease.ts
Adds androidApk to DownloadInfo.downloadUrls and returns it when mapping GitHub release assets. Minor formatting tweak (trailing comma).

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant U as User
  participant D as DownloadsPage (downloads.tsx)
  participant GR as githubRelease.ts
  participant GH as GitHub Releases API

  U->>D: Open Downloads page
  activate D
  alt Use latest release
    D->>GR: fetchLatestRelease()
    activate GR
    GR->>GH: GET /repos/.../releases/latest
    GH-->>GR: Release JSON (assets)
    GR-->>D: DownloadInfo { downloadUrls: { ..., androidApk } }
    deactivate GR
    D-->>U: Render links incl. Android APK
  else Fallback
    D-->>U: Render FALLBACK_URLS incl. androidApk
  end
  deactivate D

  note over D,GR: New: androidApk added to types, populated from release or fallback.
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related PRs

Poem

A rabbit taps the build with glee,
“An APK for Android—whee!”
New links hop in, clean and spry,
From GitHub clouds down to the UI.
Carrot-orange bytes now free to play—
Download, nibble, hop away! 🥕📱

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% 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 succinctly and accurately reflects the primary change of switching Android APK downloads to dynamic GitHub release URLs, directly matching the pull request’s objective. It is clear, specific, and free of extraneous details, making it easy for team members to understand the main update at a glance.
✨ 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 dynamic-android-apk-downloads

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

@cloudflare-workers-and-pages
Copy link
Copy Markdown

Deploying maple with  Cloudflare Pages  Cloudflare Pages

Latest commit: 97a4712
Status: ✅  Deploy successful!
Preview URL: https://38246359.maple-ca8.pages.dev
Branch Preview URL: https://dynamic-android-apk-download.maple-ca8.pages.dev

View logs

Copy link
Copy Markdown
Contributor

@greptile-apps greptile-apps Bot left a comment

Choose a reason for hiding this comment

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

Greptile Overview

Summary

This PR replaces the hardcoded Android APK download URL with a dynamic URL that fetches from the latest GitHub release, matching the pattern used for desktop downloads.

Critical Issue Found:

  • The implementation assumes the "latest" release contains Android APK files, but the current release structure shows Android APKs are published in separate tagged releases (e.g., v1.99.0-android-beta1 vs v1.99.0)
  • The latest release (v1.99.0) does NOT contain app-universal-release.apk, meaning the dynamic URL will result in 404 errors for users
  • The fallback URL also points to the wrong release structure

Required Changes:

  • Either: Ensure Android APKs are included in the main releases going forward
  • Or: Modify the logic to fetch from Android-specific release tags
  • Or: Keep the hardcoded URL approach until release structure is unified

Confidence Score: 0/5

  • This PR will break Android APK downloads with 404 errors due to incorrect assumptions about release structure
  • The code assumes Android APKs exist in the latest release, but they're published in separate Android-specific releases. This will cause immediate user-facing failures
  • Both files require attention: frontend/src/utils/githubRelease.ts needs logic to handle Android-specific releases, and frontend/src/routes/downloads.tsx should continue using hardcoded URLs until this is resolved

Important Files Changed

File Analysis

Filename Score Overview
frontend/src/utils/githubRelease.ts 1/5 Added androidApk to download URLs, but this will cause 404 errors since latest release doesn't contain Android APKs
frontend/src/routes/downloads.tsx 2/5 Replaced hardcoded Android APK URL with dynamic downloadUrls.androidApk, but this relies on incorrect assumption about release structure

Sequence Diagram

sequenceDiagram
    participant User
    participant DownloadPage
    participant githubRelease
    participant GitHubAPI
    participant Release

    User->>DownloadPage: Visit /downloads
    DownloadPage->>DownloadPage: useEffect on mount
    DownloadPage->>githubRelease: getLatestDownloadInfo()
    githubRelease->>githubRelease: fetchLatestRelease()
    githubRelease->>GitHubAPI: GET /repos/.../releases/latest
    GitHubAPI-->>githubRelease: {tag_name: "v1.99.0", ...}
    githubRelease->>githubRelease: Build download URLs
    Note over githubRelease: Constructs androidApk URL:<br/>baseUrl/app-universal-release.apk
    githubRelease-->>DownloadPage: {downloadUrls: {androidApk: "..."}}
    DownloadPage->>DownloadPage: setDownloadUrls(...)
    User->>DownloadPage: Click "Download APK"
    DownloadPage->>Release: Navigate to androidApk URL
    Release-->>User: 404 Not Found
    Note over Release: APK doesn't exist in v1.99.0<br/>Only in v1.99.0-android-beta1
Loading

2 files reviewed, 1 comment

Edit Code Review Agent Settings | Greptile

Comment thread frontend/src/utils/githubRelease.ts
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

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: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c612552 and 97a4712.

📒 Files selected for processing (2)
  • frontend/src/routes/downloads.tsx (3 hunks)
  • frontend/src/utils/githubRelease.ts (2 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,js,jsx}: Use 2-space indentation, double quotes, and a 100-character line limit for formatting
Use camelCase for variable and function names
Use try/catch with specific error types for error handling

Files:

  • frontend/src/utils/githubRelease.ts
  • frontend/src/routes/downloads.tsx
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Use strict TypeScript typing and avoid any when possible

Files:

  • frontend/src/utils/githubRelease.ts
  • frontend/src/routes/downloads.tsx
⏰ 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). (4)
  • GitHub Check: build-linux
  • GitHub Check: build-android
  • GitHub Check: build-ios
  • GitHub Check: build-macos (universal-apple-darwin)
🔇 Additional comments (4)
frontend/src/utils/githubRelease.ts (1)

20-20: LGTM!

The androidApk field addition to the interface is correct and consistent with the other download URL fields.

frontend/src/routes/downloads.tsx (3)

17-17: LGTM!

The androidApk field addition to the interface correctly matches the type definition in frontend/src/utils/githubRelease.ts.


28-29: LGTM!

The fallback URL for Android APK is consistent with the implementation in frontend/src/utils/githubRelease.ts. The static filename format matches the primary URL construction.


261-261: LGTM!

The download link correctly uses the dynamically fetched downloadUrls.androidApk, achieving the PR objective of replacing the hardcoded APK download link with dynamic URL fetching.

Comment on lines +74 to +75
linuxRpm: `${baseDownloadUrl}/Maple-${version}-1.x86_64.rpm`,
androidApk: `${baseDownloadUrl}/app-universal-release.apk`
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot Oct 13, 2025

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

Verify that the APK filename matches the GitHub release assets.

The Android APK uses a static filename app-universal-release.apk without version information, unlike other platforms which include version numbers (e.g., Maple_${version}_universal.dmg). Ensure that this exact filename exists in your GitHub releases.

Run the following script to check recent releases for APK files:


🏁 Script executed:

#!/bin/bash
# Description: Verify APK filename in GitHub releases

# Fetch the latest release and check for APK assets
gh api repos/OpenSecretCloud/Maple/releases/latest --jq '.assets[] | select(.name | endswith(".apk")) | .name'

# Also check the last 3 releases to see the pattern
echo "--- Last 3 releases APK filenames ---"
gh api repos/OpenSecretCloud/Maple/releases --jq '.[:3] | .[] | {tag: .tag_name, apks: [.assets[] | select(.name | endswith(".apk")) | .name]}'

Length of output: 161


Static APK filename not present in the latest release
The hard-coded app-universal-release.apk isn’t among assets for the latest stable release (v1.99.0). Either upload the APK to your stable releases or update this filename to match the actual asset.

🤖 Prompt for AI Agents
frontend/src/utils/githubRelease.ts around lines 74-75: the code hard-codes
androidApk to "app-universal-release.apk", which is not present in the latest
release; either replace that string with the actual APK filename used in the
latest stable release (update the literal to the exact asset name you find on
GitHub), or better, change the implementation to query the release assets (via
the GitHub Releases API) and pick the asset whose name ends with ".apk" and use
its browser_download_url as androidApk so it always matches the uploaded asset.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

@coderabbitai please check again, it was just released

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Re-check the latest release for the APK file

echo "=== Latest Release Info ==="
gh api repos/OpenSecretCloud/Maple/releases/latest --jq '{tag: .tag_name, name: .name, published: .published_at}'

echo -e "\n=== All Assets in Latest Release ==="
gh api repos/OpenSecretCloud/Maple/releases/latest --jq '.assets[] | {name: .name, size: .size, download_url: .browser_download_url}'

echo -e "\n=== Looking specifically for app-universal-release.apk ==="
gh api repos/OpenSecretCloud/Maple/releases/latest --jq '.assets[] | select(.name == "app-universal-release.apk") | {name: .name, size: .size, download_url: .browser_download_url}'

Length of output: 1996


@AnthonyRonning, you're absolutely right! ✅ I can confirm that app-universal-release.apk is now present in the latest release (v1.99.0). The file is available at:

https://github.com/OpenSecretCloud/Maple/releases/download/v1.99.0/app-universal-release.apk

The implementation looks good and will correctly fetch the APK from the latest release. The static filename approach works since your release process consistently uses the same filename for the APK asset.

Would you like me to resolve my previous comment?

@AnthonyRonning AnthonyRonning merged commit fadde9e into master Oct 13, 2025
19 checks passed
@AnthonyRonning AnthonyRonning deleted the dynamic-android-apk-downloads branch October 13, 2025 16:59
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