Skip to content

Release and Packaging

Plain releases are built from version tags.

Build the app, ZIP, and DMG:

Terminal window
make package

Package with claim tests enabled:

Terminal window
make package-claims

Package quickly for local smoke testing:

Terminal window
make package-fast

Publish a versioned GitHub Release with:

Terminal window
git tag v1.1.7
git push origin v1.1.7

The release workflow builds the app on macOS, derives CFBundleShortVersionString and artifact names from the tag, and uploads the .dmg, .zip, and SHA256SUMS.txt as release assets.

Push and pull-request CI runs deterministic checks only:

  • Swift tests
  • benchmark claim-policy unit tests
  • docs build

It does not run measured browser comparisons or power measurements. Those remain explicit local/manual benchmark workflows because the results depend on hardware, runner load, browser state, and measurement conditions.

Version tags run the stronger release path: docs build plus the claim-aware package build that produces .app, .zip, .dmg, and checksums.

Plain performs a lightweight startup check against the repository’s latest GitHub Release. If the latest release tag is newer than the packaged app’s CFBundleShortVersionString, Plain shows a prompt linking to the release page.

Plain does not include automatic downloads or in-app installation. Users update manually from GitHub Releases.

Current public builds are ad-hoc signed. To reduce first-open friction for broader distribution, Plain should move to Developer ID signing and Apple notarization when an Apple Developer Program account is available.

The release path should add:

  • Developer ID Application signing for Plain.app
  • hardened runtime options compatible with the current App Sandbox and network-client entitlement
  • notarytool submit for the ZIP or DMG artifact
  • stapling for the notarized app or DMG
  • CI secrets for the Apple team ID, signing certificate, and notarization credentials
  • a release smoke check that verifies Gatekeeper assessment before upload

This does not change Plain’s product privacy model. It changes macOS trust and install behavior for downloaded builds.

  • native SwiftUI macOS app bundle
  • URL input and page loading
  • non-URL address-bar searches through Mojeek
  • clean native rendering for Mojeek search results when possible
  • HTML fetch, sanitize, semantic extraction, and native rendering
  • local non-SVG image fetching and bounded cache
  • back/forward navigation
  • swipe back/forward navigation
  • recent pages
  • Later list with search, tags, Markdown import/export, and reading progress
  • adjacent Later item navigation with toolbar buttons and left/right arrow keys while reading from Later
  • Quotes with search, notes, tags, source links, copy, and Markdown export
  • reader read-time estimate and progress line
  • Plain News source library, custom sources, local digest generation, source/time organization, and save-to-Later support
  • find in page
  • reader text scaling and serif/sans font switching
  • light/dark/system appearance controls
  • auto-hiding top navigation bar
  • keyboard shortcuts for navigation, find, text settings, images, copying, reload, and fullscreen
  • copy clean text
  • copy Markdown
  • clear history
  • clear image cache
  • Open in Default Browser
  • plain://open?url=<encoded-url> handoff support
  • local/private/reserved-network URL blocking inspired by the Reader Worker safety envelope
  • DNS/IP resolution checks before page and image fetches
  • 15-second HTML fetch timeout and 2 MB HTML response limit
  • basic UI chrome and decorative image filtering during extraction
  • ephemeral, cookie-free page and image fetch sessions
  • App Sandbox and network-client entitlements in packaged builds
  • benchmark comparison tooling with marketing claim gates for performance, memory, power, and the no-page-JavaScript architecture claim
  • the app is ad-hoc signed, not Developer ID signed or notarized
  • macOS may warn users when opening downloaded builds
  • extraction is intentionally limited and will fail on JavaScript-heavy sites
  • no full CSS rendering, tabs, accounts, sync, JavaScript execution, or browser-extension support