-
Notifications
You must be signed in to change notification settings - Fork 57
Hosting Setup
This guide explains how to set up hosting for Ora Browser's automatic update system using Sparkle.
Ora Browser uses Sparkle for automatic updates. The system requires:
-
Appcast Feed (
appcast.xml) - Tells Sparkle about available updates -
App Distribution (
Ora-Browser.dmg) - The actual app download - Digital Signatures - Ensures update integrity and security
File: appcast.xml
Purpose: Update feed that Sparkle reads to check for new versions
Content: Release information, download URLs, version numbers, and digital signatures
File: Ora-Browser.dmg
Purpose: The actual application installer that users download
Content: Signed and notarized macOS application bundle
# Create and switch to gh-pages branch
git checkout -b gh-pages
# Remove all files except what we need for hosting
git rm -rf .
git reset -- docs/ # Keep docs if you want
# Copy appcast.xml
cp ../appcast.xml .
# Commit and push
git add appcast.xml
git commit -m "Add appcast.xml for Sparkle updates"
git push origin gh-pages- Go to your GitHub repository
- Navigate to Settings β Pages
- Set Source to "Deploy from a branch"
- Set Branch to
gh-pagesand folder to/ (root) - Click Save
-
Appcast URL:
https://the-ora.github.io/browser/appcast.xml -
DMG URL:
https://github.com/the-ora/browser/releases/download/v0.0.1/Ora-Browser.dmg
- Public web server with HTTPS
- Ability to upload files
- CORS headers configured (if needed)
- Upload
appcast.xmlto your web server - Ensure it's accessible via HTTPS
- Update the enclosure URL in
appcast.xmlto point to your DMG location
-
Appcast URL:
https://updates.yourdomain.com/appcast.xml -
DMG URL:
https://downloads.yourdomain.com/Ora-Browser.dmg
- Upload both
appcast.xmlandOra-Browser.dmgto GitHub Releases - Use raw GitHub URLs for both files
-
Appcast URL:
https://raw.githubusercontent.com/the-ora/browser/main/appcast.xml -
DMG URL:
https://github.com/the-ora/browser/releases/download/v0.0.1/Ora-Browser.dmg
# Install Sparkle
brew install --cask sparkle
# Setup command-line tools
./setup-sparkle-tools.sh
# Generate keys (run once)
./setup-sparkle.sh
# This creates in build/:
# - build/dsa_priv.pem (private key - keep secure!)
# - build/dsa_pub.pem (public key - safe to share)# Sign the DMG with your private key
sign_update -f Ora-Browser.dmg -k dsa_priv.pem
# Copy the signature outputReplace the placeholder in appcast.xml:
<!-- Replace this placeholder: -->
sparkle:dsaSignature="PLACEHOLDER_SIGNATURE_REPLACE_WITH_ACTUAL_SIGNATURE"
<!-- With your actual signature from sign_update command -->Add these keys to your Info.plist or project.yml:
<key>SUFeedURL</key>
<string>https://the-ora.github.io/browser/appcast.xml</string>
<key>SUPublicEDKey</key>
<string>YOUR_PUBLIC_KEY_HERE</string>If using XcodeGen, update project.yml:
settings:
base:
SUFeedURL: https://the-ora.github.io/browser/appcast.xml
SUPublicEDKey: YOUR_PUBLIC_KEY_HERE# Build and package the app
./build-release.sh
# Or use the comprehensive release script (auto-increments version)
./create-release.sh# Sign with Sparkle
sign_update -f Ora-Browser.dmg -k dsa_priv.pem# Update version numbers, dates, and signature in appcast.xml
# Update enclosure URL to point to your hosted DMG- Upload
appcast.xmlto your chosen hosting location - Upload
Ora-Browser.dmgto GitHub Releases - Update your app's
SUFeedURLif needed
- Build and run your app
- Go to Settings β General β Updates
- Click "Check for Updates"
- Verify the update notification appears
your-project/
βββ build/ # Build artifacts directory
β βββ appcast.xml # Update feed (public)
β βββ Ora-Browser.dmg # App installer
β βββ dsa_priv.pem # Private key (keep secure!)
β βββ dsa_pub.pem # Public key
βββ docs/ # Documentation
βββ HOSTING_SETUP.md # This guide
βββ QUICK_START.md # Quick setup guide
-
Never commit
dsa_priv.pemto version control - Store securely (password manager, secure server)
- Use different keys for different environments if needed
- Always host
appcast.xmlover HTTPS - GitHub Pages automatically provides HTTPS
- Custom servers must have valid SSL certificates
- Sparkle automatically verifies signatures
- Users cannot install updates without valid signatures
- Invalid signatures will be rejected by macOS Gatekeeper
- Check
SUFeedURLin Info.plist is correct - Verify
appcast.xmlis accessible via browser - Check signature is valid (not placeholder)
- Verify version numbers are incrementing
- Check DMG URL in
appcast.xmlis correct - Verify DMG is publicly accessible
- Check file permissions on hosting server
- Ensure DMG is properly signed and notarized
- Verify you're using the correct private key
- Check the signature was copied correctly
- Ensure no extra whitespace in signature
- Test with a fresh signature generation
- Build new release with incremented version
- Sign with private key
- Update
appcast.xmlwith new version info - Upload new DMG to releases
- Update appcast on hosting server
- Use semantic versioning (e.g., 1.0.0, 1.0.1, 1.1.0)
- Update both
CFBundleShortVersionStringandCFBundleVersion - Ensure version numbers increment for each release
For issues with:
- Sparkle framework: https://sparkle-project.org/documentation/
- GitHub Pages: https://docs.github.com/en/pages
- App signing: https://developer.apple.com/support/code-signing/
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:sparkle="http://www.andymatuschak.org/xml-namespaces/sparkle" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Ora Browser Changelog</title>
<description>Most recent changes with links to updates.</description>
<language>en</language>
<item>
<title>Ora Browser 0.0.1</title>
<description>
<![CDATA[
<h2>Initial Release</h2>
<p>Ora Browser is a fast, secure, and beautiful browser built for macOS.</p>
<ul>
<li>Native macOS UI built with SwiftUI</li>
<li>Fast browsing powered by WebKit</li>
<li>Privacy-first with built-in content blocker</li>
</ul>
]]>
</description>
<pubDate>Thu, 04 Sep 2025 14:51:08 +0000</pubDate>
<enclosure url="https://github.com/the-ora/browser/releases/download/v0.0.1/Ora-Browser.dmg"
sparkle:version="1"
sparkle:shortVersionString="0.0.1"
length="26254848"
type="application/octet-stream"
sparkle:dsaSignature="YOUR_ACTUAL_SIGNATURE_HERE"/>
</item>
</channel>
</rss>Last Updated: September 4, 2025 Ora Browser Version: 0.0.1 </xai:function_call: write> /Users/keni/code/ora/browser/docs/HOSTING_SETUP.md