grammargem/AppSupport/Info.plist
BigMarc e8b7dff65d Add Sparkle auto-update (appcast on grammagem.app)
Installed apps now show an 'Update available' button (menu bar) and can
one-click install signed updates. Adds the Sparkle dependency, an
UpdaterManager wired into AppState, the menu-bar banner + 'Check for
Updates', and Info.plist SUFeedURL (https://grammagem.app/appcast.xml),
SUPublicEDKey, and scheduled background checks.

Build / release:
- build.sh embeds + rpaths Sparkle.framework; sign-app.sh signs it
  inside-out (XPC services, Updater.app, Autoupdate, framework, then app)
  for a valid, notarizable signature.
- release.sh stamps the version, builds, signs, notarizes, staples, zips,
  and emits the EdDSA-signed appcast.xml to upload to grammagem.app.
- A hidden --update-selftest checks a feed headlessly (CI/build pipeline).

Verified: a v0.1.0 build detects a v0.2.0 update against a local signed
appcast (UPDATE_FOUND: 0.2.0); the signed app passes codesign --strict.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 08:22:35 +02:00

62 lines
2.2 KiB
Plaintext

<?xml version="1.0" encoding="UTF-8"?>
<!--
Info.plist for the packaged GrammaGem.app bundle.
`swift build` produces a bare executable; to ship a real menu-bar app you wrap
it in a .app bundle with this Info.plist (see scripts/build.sh) or, more
commonly, build from an Xcode app target that uses this file.
LSUIElement = menu-bar app with no Dock icon. (The code also calls
NSApp.setActivationPolicy(.accessory) so it behaves correctly even when run
as a bare SwiftPM executable.)
NOTE: Accessibility permission is requested at runtime via AXIsProcessTrusted
and has no Info.plist usage-string key. Input Monitoring (for synthetic ⌘C/⌘V
in the clipboard fallback) is likewise system-managed.
-->
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>GrammaGem</string>
<key>CFBundleDisplayName</key>
<string>GrammaGem</string>
<key>CFBundleIdentifier</key>
<string>com.grammagem.app</string>
<key>CFBundleExecutable</key>
<string>GrammaGem</string>
<key>CFBundleIconFile</key>
<string>AppIcon</string>
<key>CFBundleIconName</key>
<string>AppIcon</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>0.1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSMinimumSystemVersion</key>
<string>14.0</string>
<key>LSUIElement</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string>© 2026 FounderGem LLC. Built in public.</string>
<key>NSPrincipalClass</key>
<string>NSApplication</string>
<!-- Sparkle auto-update. Appcast is served from grammagem.app and updates are
EdDSA-signed with the key whose public half is below (private key lives in
the release machine's keychain; sign with scripts/release.sh). -->
<key>SUFeedURL</key>
<string>https://grammagem.app/appcast.xml</string>
<key>SUPublicEDKey</key>
<string>IwYch+DRgNk3gmCwe86z+SIc4sRdyDf4Z6xGpS+JXDc=</string>
<key>SUEnableAutomaticChecks</key>
<true/>
<key>SUScheduledCheckInterval</key>
<integer>86400</integer>
<key>SUAutomaticallyUpdate</key>
<false/>
</dict>
</plist>