dependabot/npm_and_yarn/katex-0.16.27
Desktop Downloads Feature - Master Documentation
Complete implementation guide for fetching and displaying desktop app downloads from private GitHub repositories
🎯 What This Is
A production-ready system that: - Fetches desktop app releases from your private GitHub repository - Automatically detects platform and architecture from filenames - Provides secure download links without exposing GitHub tokens - Displays download options in a beautiful, responsive interface
📁 Files Created
Core Implementation
src/pages/api/download-desktop-app.ts # API endpoint for GitHub releases
src/pages/download.astro # Download page with UI
src/types/github-releases.ts # TypeScript types & patterns
Testing & Utilities
scripts/test-github-releases.js # GitHub connection test script
.env.example # Environment variables template
Documentation
DESKTOP_DOWNLOADS_FEATURE.md # This file - master overview
DESKTOP_DOWNLOADS_SETUP.md # Comprehensive setup guide
QUICK_START_DOWNLOADS.md # 5-minute quick start
IMPLEMENTATION_SUMMARY.md # Technical implementation details
DEPLOYMENT_CHECKLIST.md # Pre/post deployment checklist
docs/DOWNLOADS_README.md # Complete feature documentation
🚀 Quick Start (5 Minutes)
1. Create GitHub Token
# Visit: https://github.com/settings/tokens
# Generate new token with 'repo' scope
# Copy the token immediately
2. Configure Environment
# Create .env file in project root
echo "GITHUB_TOKEN=ghp_your_actual_token_here" > .env
3. Test Setup
# Verify GitHub API connection
npm run test:releases
4. Run Locally
# Start development server
npm run dev
# Visit in browser
open http://localhost:4321/download
5. Upload Release
# Go to: https://github.com/setoelkahfi/pepakbasajawa/releases
# Create new release with files named like:
# - pepakbasajawa-1.0.0-macos-arm64.dmg
# - pepakbasajawa-1.0.0-windows-x64.exe
# - pepakbasajawa-1.0.0-linux-x64.AppImage
📚 Documentation Map
Choose your path:
🏃 I want to get started quickly
→ Read: docs/QUICK_START_DOWNLOADS.md (5 minutes)
📖 I need complete setup instructions
→ Read: docs/DESKTOP_DOWNLOADS_SETUP.md (15 minutes)
🔍 I want to understand how it works
→ Read: docs/IMPLEMENTATION_SUMMARY.md (20 minutes)
📋 I'm ready to deploy
→ Use: docs/DEPLOYMENT_CHECKLIST.md
🛠️ I need API and usage details
→ Read: docs/DOWNLOADS_README.md (comprehensive)
✨ Features
Security
- ✅ GitHub token never exposed to clients
- ✅ Downloads proxied through secure API
- ✅ Environment-based configuration
- ✅ Fine-grained token support
Performance
- ✅ 5-minute response caching
- ✅ Optimized API calls
- ✅ Fast page loads
- ✅ CDN-friendly
User Experience
- ✅ Automatic platform detection
- ✅ Responsive mobile design
- ✅ File size formatting
- ✅ Platform-specific icons (🍎 🪟 🐧)
- ✅ Real-time version display
Developer Experience
- ✅ Full TypeScript support
- ✅ Built-in test utilities
- ✅ Comprehensive error handling
- ✅ Detailed logging
- ✅ Extensive documentation
🎨 Supported Platforms
macOS
- Apple Silicon (M1/M2/M3) - arm64
- Intel - x64
- Universal binaries
- Formats:
.dmg,.pkg
Windows
- x64 (most common)
- ARM64 (Surface, etc.)
- x86 (legacy)
- Formats:
.exe,.msi,.msix
Linux
- x64 / x86_64
- ARM64 / aarch64
- Formats:
.AppImage,.deb,.rpm,.tar.gz,.snap
🔧 How It Works
┌─────────────────────────────────────────────────────────────┐
│ User │
└────────────────────┬────────────────────────────────────────┘
│
│ 1. Visit /download
▼
┌─────────────────────────────────────────────────────────────┐
│ Download Page (Astro) │
│ • Shows mobile app store links │
│ • Loads desktop downloads via API │
└────────────────────┬────────────────────────────────────────┘
│
│ 2. Fetch /api/download-desktop-app
▼
┌─────────────────────────────────────────────────────────────┐
│ API Endpoint (Server-side) │
│ • Authenticates with GitHub token │
│ • Fetches latest release │
│ • Parses and categorizes assets │
│ • Returns structured download links │
└────────────────────┬────────────────────────────────────────┘
│
│ 3. Authenticate & fetch
▼
┌─────────────────────────────────────────────────────────────┐
│ GitHub API (Private Repository) │
│ • /repos/{owner}/{repo}/releases/latest │
│ • /repos/{owner}/{repo}/releases/assets/{id} │
└─────────────────────────────────────────────────────────────┘
When user clicks download:
User → API (/download?assetId=123) → GitHub → Temp URL → Download starts
📝 File Naming Convention
Pattern: {app}-{version}-{platform}-{arch}.{ext}
Examples: ```bash ✅ pepakbasajawa-1.0.0-macos-arm64.dmg ✅ pepakbasajawa-1.0.0-macos-x64.dmg ✅ pepakbasajawa-1.0.0-windows-x64.exe ✅ pepakbasajawa-1.0.0-linux-x64.AppImage ✅ pepakbasajawa-1.0.0-linux-x64.deb
❌ app.dmg # Too generic ❌ release-v1.exe # No platform info ❌ my-app-latest.AppImage # No version ```
🧪 Testing
Test GitHub Connection
npm run test:releases
Expected output: ``` 🔍 Testing GitHub API Connection
✓ GitHub token found ✓ Authenticated as: setoelkahfi ✓ Found release: Release 1.0.0
📋 Release Assets: 🍎 pepakbasajawa-1.0.0-macos-arm64.dmg Platform: macOS (Apple Silicon) Size: 120.00 MB
✅ All tests passed! ```
Test API Endpoint
# Start server
npm run dev
# Test in another terminal
curl http://localhost:4321/api/download-desktop-app | jq
Test in Browser
open http://localhost:4321/download
🚀 Deployment
Vercel
vercel env add GITHUB_TOKEN
# Paste token when prompted
vercel --prod
Netlify
netlify env:set GITHUB_TOKEN your_token_here
netlify deploy --prod
Other Platforms
Add GITHUB_TOKEN environment variable in your hosting dashboard.
⚠️ Common Issues & Solutions
"GITHUB_TOKEN is not configured"
# Check .env file exists
cat .env | grep GITHUB_TOKEN
# Restart dev server
npm run dev
"Failed to fetch releases"
# Verify token permissions
# Token needs 'repo' scope for private repos
# Test manually
curl -H "Authorization: Bearer $GITHUB_TOKEN" \
https://api.github.com/repos/setoelkahfi/pepakbasajawa/releases/latest
No downloads showing
# Run diagnostic
npm run test:releases
# Check:
# 1. Release exists and is "latest"
# 2. Release has uploaded assets
# 3. Asset filenames match patterns
📊 API Response Example
{
"version": "v1.0.0",
"name": "Release 1.0.0",
"published_at": "2024-01-15T10:00:00Z",
"downloads": [
{
"platform": "macOS",
"architecture": "Apple Silicon",
"url": "/api/download-desktop-app?action=download&assetId=12345",
"filename": "pepakbasajawa-1.0.0-macos-arm64.dmg",
"size": 125829120,
"version": "v1.0.0"
},
{
"platform": "Windows",
"architecture": "x64",
"url": "/api/download-desktop-app?action=download&assetId=12346",
"filename": "pepakbasajawa-1.0.0-windows-x64.exe",
"size": 98765432,
"version": "v1.0.0"
}
]
}
🔒 Security Checklist
-
.envfile is in.gitignore - GitHub token not committed to repository
- Token has minimum required permissions
- Production environment variable is set
- Token rotation scheduled (every 6-12 months)
- HTTPS enabled in production
📈 Performance
Caching: 5-minute cache on API responses Rate Limits: 5,000 GitHub API requests/hour (authenticated) Page Load: < 3 seconds typical API Response: < 2 seconds typical
🎓 Inspiration
This implementation is inspired by: - Practical Bazel: Downloading Private Release Assets from GitHub - GitHub's API best practices - Astro's API routes patterns
🆘 Support
Documentation
- Setup Guide:
DESKTOP_DOWNLOADS_SETUP.md - Quick Start:
QUICK_START_DOWNLOADS.md - Full Docs:
docs/DOWNLOADS_README.md
Contact
- Email: info@pepakbasajawa.com
- Repository: https://github.com/setoelkahfi/pepakbasajawa
External Resources
📋 Next Steps
- Now: Follow Quick Start guide
- Then: Upload first release to GitHub
- Next: Test locally with
npm run test:releases - Finally: Deploy to production
✅ Deployment Checklist
Use docs/DEPLOYMENT_CHECKLIST.md for comprehensive pre/post deployment checks.
Quick checklist: - [ ] GitHub token created and configured - [ ] Local testing successful - [ ] Release uploaded to GitHub - [ ] Environment variables set in production - [ ] Deployed to staging/production - [ ] Production testing completed - [ ] Monitoring enabled
🎉 Success!
Once deployed, users can: - Visit your download page - See available desktop apps for all platforms - Download the correct version for their system - Get automatic updates when you release new versions
All while keeping your GitHub repository private and secure! 🔒
Version: 1.0.0
Last Updated: 2024
Status: ✅ Production Ready
Tested: macOS, Windows, Linux
License: Part of PepakBasaJawa project