diff --git a/beta-updates.mdx b/beta-updates.mdx new file mode 100644 index 00000000..60cfbe9f --- /dev/null +++ b/beta-updates.mdx @@ -0,0 +1,33 @@ +--- +title: Beta updates +description: "Get each new version before it reaches everyone, and go back to stable releases" +--- + +Every new minor version ships as one or more betas before its stable release, such as `0.82.0-beta.1` ahead of `0.82.0`. Patch releases skip the beta and go straight to stable. + +## Getting betas + + + + Open **Settings > General** and, under Software Update, select **Get beta updates**. + + + Click **Check for Updates…**, or wait for the next daily check. The newest release wins, beta or stable. + + + +**TablePro > About TablePro** shows the version you run, with `-beta.N` in it while you are on a beta. + +## Going back to stable + +Deselect **Get beta updates**. The beta stays installed, because an update never moves to a lower version. The first stable release above it replaces it: on `0.82.0-beta.2`, that is `0.82.0`. + +To leave sooner, download the current stable from [Installation](/installation) and install it over the beta. A beta never writes connections or settings that the stable release before it cannot read. + +## Reporting a problem + +Open an issue on [GitHub](https://github.com/TableProApp/TablePro/issues) with the full version from **TablePro > About TablePro**. A beta with an open regression does not become the stable release. + +## For administrators + +The setting is the `com.TablePro.updates.receivesBetaUpdates` key, which a configuration profile can pin for a fleet. See [Managed updates](/security/managed-updates). diff --git a/customization/general-settings.mdx b/customization/general-settings.mdx index 07f43d1a..f814ab9a 100644 --- a/customization/general-settings.mdx +++ b/customization/general-settings.mdx @@ -64,19 +64,21 @@ External links you chose to always allow, each with **Forget**, plus **Forget Al ## Software update -Both switches are on out of the box, and together they are the whole of the decision: the first one stops the daily check, the second stops the install. +The first two switches are on out of the box, and together they are the whole of the decision: the first one stops the daily check, the second stops the install. **Automatically check for updates** runs the check in the background once a day. Turn it off and nothing reaches the network unless you press the button. **Download and install updates automatically** fetches the new version in the background and swaps it in the next time TablePro quits, with no dialog. Turn it off to be asked first. With the check switched off the switch is dimmed and installs never run. +**Get beta updates** is off out of the box. Turn it on to be offered each new version as a beta before its stable release. [Beta updates](/beta-updates) covers going back to stable. + **Last checked** sits beside **Check for Updates…**, which checks now and is also **TablePro > Check for Updates…** in the menu bar. A check you press ignores the schedule and any staged rollout, so it always offers the newest build. When a background check finds something, nothing jumps in front of you. The menu item and the button both change to **Update Available…** and wait until you come back. Updates arrive through [Sparkle](https://sparkle-project.org/) and are signature-checked before they install. **What's New** opens the highlights of the version you are running, with a button to the full changelog. It is also **Help > What's New**. -An administrator can pin both switches and the interval across a fleet. See [Managed updates](/security/managed-updates). +An administrator can pin all three switches and the interval across a fleet. See [Managed updates](/security/managed-updates). ## Privacy diff --git a/customization/settings.mdx b/customization/settings.mdx index 1c2d08dc..151c6135 100644 --- a/customization/settings.mdx +++ b/customization/settings.mdx @@ -47,6 +47,7 @@ What a fresh install ships with, so one glance down this column says what you ch | General | Query timeout | 60 seconds | | General | Automatically check for updates | On | | General | Download and install updates automatically | On | +| General | Get beta updates | Off | | General | Share usage data | On | | Appearance | Appearance | System | | Appearance | Light theme | Default Light | diff --git a/docs.json b/docs.json index 78ec9d68..78e61e92 100644 --- a/docs.json +++ b/docs.json @@ -199,6 +199,7 @@ "pages": [ "index", "installation", + "beta-updates", "quickstart", "switching", "faq", diff --git a/security/managed-updates.mdx b/security/managed-updates.mdx index dc67ba7d..0164d597 100644 --- a/security/managed-updates.mdx +++ b/security/managed-updates.mdx @@ -5,16 +5,19 @@ description: "Pinning update behavior across a fleet with a configuration profil TablePro reads its update preferences from the `com.TablePro` domain before falling back to the values inside the app. A managed preference written by MDM therefore wins over anything a person picks in **Settings > General**. The switch is not dimmed: it takes the click, and then reads back at the pinned value. -Three keys decide the behavior. +Four keys decide the behavior. | Key | Type | Meaning | Shipped default | | --- | --- | --- | --- | | `SUEnableAutomaticChecks` | Boolean | Whether the app checks for updates at all. `false` leaves **Check for Updates…** as the only route. | `true` | | `SUAutomaticallyUpdate` | Boolean | Whether a new version downloads and installs on quit without being accepted first. | `true` | | `SUScheduledCheckInterval` | Integer | Seconds between checks. `86400` is daily, `604800` weekly. Sparkle clamps anything under one hour. | `86400` | +| `com.TablePro.updates.receivesBetaUpdates` | Boolean | Whether checks offer [betas](/beta-updates) as well as stable releases. | `false` | Pinning `SUAutomaticallyUpdate` on its own does nothing while `SUEnableAutomaticChecks` is `false`. Sparkle derives the install setting from the check setting, so the install never runs and the switch stays dimmed. +Pinning `com.TablePro.updates.receivesBetaUpdates` to `false` leaves a Mac already on a beta where it is until a stable release passes it. Install the current stable over the beta to move it back sooner. + A profile that turns off background updating entirely: ```xml @@ -45,7 +48,7 @@ Pinning `SUEnableAutomaticChecks` to `false` means security fixes never arrive o **Check for Updates…** still works and still reaches the feed. It is a person asking, not a background check, so no key here suppresses it. -Signature checking is not configurable. Every build is verified against the EdDSA public key inside the app before anything installs, and there is no key that turns that off. [Privacy](/security/privacy#update-checks) covers what an update check sends. +Signature checking is not configurable. The feed and every build are verified against the EdDSA public key inside the app before anything installs, and there is no key that turns that off. [Privacy](/security/privacy#update-checks) covers what an update check sends. ## Auditing what a Mac is set to @@ -53,6 +56,7 @@ Signature checking is not configurable. Every build is verified against the EdDS defaults read com.TablePro SUEnableAutomaticChecks defaults read com.TablePro SUAutomaticallyUpdate defaults read com.TablePro SUScheduledCheckInterval +defaults read com.TablePro com.TablePro.updates.receivesBetaUpdates ``` A key that reads `does not exist` is unset, and the shipped default in the table above applies. diff --git a/security/privacy.mdx b/security/privacy.mdx index 3c005a6a..79723a2c 100644 --- a/security/privacy.mdx +++ b/security/privacy.mdx @@ -8,7 +8,7 @@ Three requests leave a stock install without you asking: one usage heartbeat a d | Channel | Goes to | On by default | Off switch | | --- | --- | --- | --- | | [Usage heartbeat](#usage-heartbeat) | `api.tablepro.app` | Yes | **Settings > General**, under Privacy | -| [Update check](#update-checks) | `raw.githubusercontent.com` | Yes | **Settings > General**, under Software Update | +| [Update check](#update-checks) | `updates.tablepro.app` | Yes | **Settings > General**, under Software Update | | [Plugin catalog](#the-plugin-catalog) | `raw.githubusercontent.com` | Yes | None | | [AI provider](#ai-providers) | whichever provider you add | No provider is configured on a fresh install | Delete the provider, or turn off **Enable AI Features** | | [iCloud sync](#icloud-sync) | your own iCloud account | No | **Settings > Sync** | @@ -108,9 +108,9 @@ Every call is written to the local activity log with the token behind it, statem ## Update checks -Sparkle fetches `https://raw.githubusercontent.com/TableProApp/TablePro/main/appcast.xml` once a day, and once for every **Check for Updates…** you press. It is a plain `GET` with no query parameters: system profiling is off, so nothing about your Mac rides along. The user agent names the app and its version, and GitHub sees your IP address as it would for any web request. +Sparkle fetches `https://updates.tablepro.app/appcast.xml` once a day, and once for every **Check for Updates…** you press. It is a plain `GET` with no query parameters: system profiling is off, so nothing about your Mac rides along. The user agent names the app and its version, and GitHub Pages, which hosts the feed, sees your IP address as it would for any web request. **Get beta updates** sends nothing extra: the one feed lists stable releases and betas, and your Mac picks between them. Versions without **Get beta updates** fetch `https://raw.githubusercontent.com/TableProApp/TablePro/main/appcast.xml` instead. -Updates download from the GitHub release named in the feed, and Sparkle checks each build's EdDSA signature against the public key inside the app before it installs anything. +Updates download from the GitHub release named in the feed. Sparkle checks the feed's EdDSA signature, and each build's, against the public key inside the app, and refuses either one that does not match before it unpacks anything. **Automatically check for updates** in **Settings > General** is on by default. With it off, **Check for Updates…** in the same section is the only thing that reaches the feed.