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

  • .env file 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

External Resources

📋 Next Steps

  1. Now: Follow Quick Start guide
  2. Then: Upload first release to GitHub
  3. Next: Test locally with npm run test:releases
  4. 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