Release and Packaging
Plain releases are built from version tags.
Local Packaging
Section titled “Local Packaging”Build the app, ZIP, and DMG:
make packagePackage with claim tests enabled:
make package-claimsPackage quickly for local smoke testing:
make package-fastRelease Tags
Section titled “Release Tags”Publish a versioned GitHub Release with:
git tag v1.1.7git push origin v1.1.7The 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.
CI Policy
Section titled “CI Policy”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.
Update Checks
Section titled “Update Checks”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.
Developer ID and Notarization Path
Section titled “Developer ID and Notarization Path”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 Applicationsigning forPlain.app- hardened runtime options compatible with the current App Sandbox and network-client entitlement
notarytool submitfor 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.
Current Release Includes
Section titled “Current Release Includes”- 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
Known Limitations
Section titled “Known Limitations”- 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