Skip to content

Make Android APK downloads use dynamic GitHub release URLs - #264

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

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

Conversation

@AnthonyRonning

@AnthonyRonningAnthonyRonning commented Oct 13, 2025

Copy link
Copy Markdown
Contributor

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

coderabbitaiBot commented Oct 13, 2025

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title Check✅ PassedThe 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

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown
Contributor

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

FilenameScoreOverview
frontend/src/utils/githubRelease.ts1/5Added androidApk to download URLs, but this will cause 404 errors since latest release doesn't contain Android APKs
frontend/src/routes/downloads.tsx2/5Replaced 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 threadfrontend/src/utils/githubRelease.ts

@coderabbitaicoderabbitaiBot 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: 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`

@coderabbitaicoderabbitaiBotOct 13, 2025

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

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 patternecho"--- 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
ContributorAuthor

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 masterOct 13, 2025
19 checks passed
@AnthonyRonning
AnthonyRonning deleted the dynamic-android-apk-downloads branch October 13, 2025 16:59
Sign up for freeto 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

@AnthonyRonning
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Make Android APK downloads use dynamic GitHub release URLs by AnthonyRonning · Pull Request #264 · OpenSecretCloud/Maple · GitHub
Skip to content

Make Android APK downloads use dynamic GitHub release URLs - #264

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

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

Conversation

@AnthonyRonning

@AnthonyRonningAnthonyRonning commented Oct 13, 2025

Copy link
Copy Markdown
Contributor

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

coderabbitaiBot commented Oct 13, 2025

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title Check✅ PassedThe 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

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown
Contributor

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

FilenameScoreOverview
frontend/src/utils/githubRelease.ts1/5Added androidApk to download URLs, but this will cause 404 errors since latest release doesn't contain Android APKs
frontend/src/routes/downloads.tsx2/5Replaced 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 threadfrontend/src/utils/githubRelease.ts

@coderabbitaicoderabbitaiBot 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: 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`

@coderabbitaicoderabbitaiBotOct 13, 2025

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

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 patternecho"--- 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
ContributorAuthor

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 masterOct 13, 2025
19 checks passed
@AnthonyRonning
AnthonyRonning deleted the dynamic-android-apk-downloads branch October 13, 2025 16:59
Sign up for freeto 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

@AnthonyRonning
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Make Android APK downloads use dynamic GitHub release URLs by AnthonyRonning · Pull Request #264 · OpenSecretCloud/Maple · GitHub
Skip to content

Make Android APK downloads use dynamic GitHub release URLs - #264

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

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

Conversation

@AnthonyRonning

@AnthonyRonningAnthonyRonning commented Oct 13, 2025

Copy link
Copy Markdown
Contributor

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

coderabbitaiBot commented Oct 13, 2025

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title Check✅ PassedThe 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

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown
Contributor

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

FilenameScoreOverview
frontend/src/utils/githubRelease.ts1/5Added androidApk to download URLs, but this will cause 404 errors since latest release doesn't contain Android APKs
frontend/src/routes/downloads.tsx2/5Replaced 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 threadfrontend/src/utils/githubRelease.ts

@coderabbitaicoderabbitaiBot 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: 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`

@coderabbitaicoderabbitaiBotOct 13, 2025

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

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 patternecho"--- 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
ContributorAuthor

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 masterOct 13, 2025
19 checks passed
@AnthonyRonning
AnthonyRonning deleted the dynamic-android-apk-downloads branch October 13, 2025 16:59
Sign up for freeto 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

@AnthonyRonning
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Make Android APK downloads use dynamic GitHub release URLs by AnthonyRonning · Pull Request #264 · OpenSecretCloud/Maple · GitHub
Skip to content

Make Android APK downloads use dynamic GitHub release URLs - #264

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

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

Conversation

@AnthonyRonning

@AnthonyRonningAnthonyRonning commented Oct 13, 2025

Copy link
Copy Markdown
Contributor

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

coderabbitaiBot commented Oct 13, 2025

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title Check✅ PassedThe 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

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown
Contributor

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

FilenameScoreOverview
frontend/src/utils/githubRelease.ts1/5Added androidApk to download URLs, but this will cause 404 errors since latest release doesn't contain Android APKs
frontend/src/routes/downloads.tsx2/5Replaced 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 threadfrontend/src/utils/githubRelease.ts

@coderabbitaicoderabbitaiBot 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: 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`

@coderabbitaicoderabbitaiBotOct 13, 2025

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

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 patternecho"--- 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
ContributorAuthor

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 masterOct 13, 2025
19 checks passed
@AnthonyRonning
AnthonyRonning deleted the dynamic-android-apk-downloads branch October 13, 2025 16:59
Sign up for freeto 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

@AnthonyRonning
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Make Android APK downloads use dynamic GitHub release URLs by AnthonyRonning · Pull Request #264 · OpenSecretCloud/Maple · GitHub
Skip to content

Make Android APK downloads use dynamic GitHub release URLs - #264

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

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

Conversation

@AnthonyRonning

@AnthonyRonningAnthonyRonning commented Oct 13, 2025

Copy link
Copy Markdown
Contributor

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

coderabbitaiBot commented Oct 13, 2025

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title Check✅ PassedThe 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

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown
Contributor

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

FilenameScoreOverview
frontend/src/utils/githubRelease.ts1/5Added androidApk to download URLs, but this will cause 404 errors since latest release doesn't contain Android APKs
frontend/src/routes/downloads.tsx2/5Replaced 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 threadfrontend/src/utils/githubRelease.ts

@coderabbitaicoderabbitaiBot 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: 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`

@coderabbitaicoderabbitaiBotOct 13, 2025

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

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 patternecho"--- 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
ContributorAuthor

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 masterOct 13, 2025
19 checks passed
@AnthonyRonning
AnthonyRonning deleted the dynamic-android-apk-downloads branch October 13, 2025 16:59
Sign up for freeto 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

@AnthonyRonning
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Make Android APK downloads use dynamic GitHub release URLs by AnthonyRonning · Pull Request #264 · OpenSecretCloud/Maple · GitHub
Skip to content

Make Android APK downloads use dynamic GitHub release URLs - #264

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

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

Conversation

@AnthonyRonning

@AnthonyRonningAnthonyRonning commented Oct 13, 2025

Copy link
Copy Markdown
Contributor

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

coderabbitaiBot commented Oct 13, 2025

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title Check✅ PassedThe 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

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown
Contributor

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

FilenameScoreOverview
frontend/src/utils/githubRelease.ts1/5Added androidApk to download URLs, but this will cause 404 errors since latest release doesn't contain Android APKs
frontend/src/routes/downloads.tsx2/5Replaced 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 threadfrontend/src/utils/githubRelease.ts

@coderabbitaicoderabbitaiBot 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: 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`

@coderabbitaicoderabbitaiBotOct 13, 2025

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

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 patternecho"--- 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
ContributorAuthor

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 masterOct 13, 2025
19 checks passed
@AnthonyRonning
AnthonyRonning deleted the dynamic-android-apk-downloads branch October 13, 2025 16:59
Sign up for freeto 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

@AnthonyRonning
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Make Android APK downloads use dynamic GitHub release URLs by AnthonyRonning · Pull Request #264 · OpenSecretCloud/Maple · GitHub
Skip to content

Make Android APK downloads use dynamic GitHub release URLs - #264

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

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

Conversation

@AnthonyRonning

@AnthonyRonningAnthonyRonning commented Oct 13, 2025

Copy link
Copy Markdown
Contributor

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

coderabbitaiBot commented Oct 13, 2025

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title Check✅ PassedThe 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

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown
Contributor

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

FilenameScoreOverview
frontend/src/utils/githubRelease.ts1/5Added androidApk to download URLs, but this will cause 404 errors since latest release doesn't contain Android APKs
frontend/src/routes/downloads.tsx2/5Replaced 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 threadfrontend/src/utils/githubRelease.ts

@coderabbitaicoderabbitaiBot 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: 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`

@coderabbitaicoderabbitaiBotOct 13, 2025

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

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 patternecho"--- 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
ContributorAuthor

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 masterOct 13, 2025
19 checks passed
@AnthonyRonning
AnthonyRonning deleted the dynamic-android-apk-downloads branch October 13, 2025 16:59
Sign up for freeto 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

@AnthonyRonning
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Make Android APK downloads use dynamic GitHub release URLs by AnthonyRonning · Pull Request #264 · OpenSecretCloud/Maple · GitHub
Skip to content

Make Android APK downloads use dynamic GitHub release URLs - #264

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

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

Conversation

@AnthonyRonning

@AnthonyRonningAnthonyRonning commented Oct 13, 2025

Copy link
Copy Markdown
Contributor

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

coderabbitaiBot commented Oct 13, 2025

Copy link
Copy Markdown

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 nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring 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 nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title Check✅ PassedThe 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

@greptile-appsgreptile-appsBot left a comment

Copy link
Copy Markdown
Contributor

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

FilenameScoreOverview
frontend/src/utils/githubRelease.ts1/5Added androidApk to download URLs, but this will cause 404 errors since latest release doesn't contain Android APKs
frontend/src/routes/downloads.tsx2/5Replaced 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 threadfrontend/src/utils/githubRelease.ts

@coderabbitaicoderabbitaiBot 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: 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`

@coderabbitaicoderabbitaiBotOct 13, 2025

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

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 patternecho"--- 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
ContributorAuthor

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 masterOct 13, 2025
19 checks passed
@AnthonyRonning
AnthonyRonning deleted the dynamic-android-apk-downloads branch October 13, 2025 16:59
Sign up for freeto 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

@AnthonyRonning