Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 0 additions & 92 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,6 @@ cycle through the spectrum.

Requires macOS 13 or later. Universal (Apple silicon and Intel).

## Install

```sh
make install
```

Then open System Settings → Screen Saver and pick **Macstify**.

macOS keeps the loaded bundle cached, so when you install a newer build over an older one, the old
version may keep running. Force a reload with:

```sh
killall legacyScreenSaver
```

and quit and reopen System Settings.

## Options

![Options](docs/options.png)
Expand All @@ -39,78 +22,3 @@ and quit and reopen System Settings.
| Color speed | 1.00× | 0.0–3.0 | Hue cycling rate. `0.00×` freezes each shape on its starting color. |

Settings are stored per user through `ScreenSaverDefaults` under `jp.winebarrel.Macstify`.

## Development

Built in Swift 6 language mode, so strict concurrency checking is on. Everything that touches AppKit
runs on the main actor; `MacstifyEngine` stays free of actor isolation, which is what lets the
snapshot path drive it directly.

`Sources/MacstifyEngine.swift` holds the simulation and drawing, and depends on nothing but a
`CGRect` and a `CGContext`. `MacstifyPreview` is a development harness around it:

```sh
make preview # build it and open the live window

P=build/Build/Products/Release/MacstifyPreview.app/Contents/MacOS/MacstifyPreview

$P # live window
$P --options # live window with the Options sheet open
$P --snapshot out.png --frames 900 # render frames offscreen, write a PNG
$P --snapshot out.png --preview # as the small System Settings thumbnail
$P --snapshot out.png --speed 4 # override the saved speed for one render
$P --snapshot out.png --options # render the Options sheet itself
```

The live window hosts the real `MacstifyView`; snapshots drive the engine directly, which is how
`--speed` applies to a single render without touching your saved settings. `--size` is in points and
snapshots are written at 2x, as on a Retina display.

The screenshots above were produced with `--snapshot`.

CI builds and analyses both schemes and runs the same checks `make lint` and `make format` run
locally.

### Thumbnail

The picker in System Settings shows `Contents/Resources/thumbnail.png` and `thumbnail@2x.png`
(90×58 and 180×116, the sizes Apple's own savers use). Without them macOS substitutes a generic
placeholder image. `COMBINE_HIDPI_IMAGES` is off so the two stay separate PNGs instead of being
merged into a single `thumbnail.tiff`, which the picker does not pick up.

Trail spacing is proportional to the screen's shorter edge while line width is absolute, so a
render this small collapses into a fat line at the stored speed. `--speed` compensates:

```sh
$P --snapshot Resources/thumbnail@2x.png --preview --size 90x58 --speed 4 --frames 600
sips -Z 90 Resources/thumbnail@2x.png --out Resources/thumbnail.png
```

## Releasing

`make install` signs with whatever certificate the project is configured for, which is enough for a
saver you build and install yourself. Copying that bundle to another Mac is not: it arrives
quarantined, and Gatekeeper refuses anything without a Developer ID signature and a notarization
ticket.

```sh
make release
```

builds with the Developer ID identity and a secure timestamp, submits the bundle to Apple's notary
service, staples the returned ticket, and writes `dist/Macstify.zip` alongside a SHA-256
`dist/checksum.txt`. The zip that gets submitted and the zip that gets distributed are different
files — stapling applies to the bundle, so the distributable has to be re-zipped afterwards.

It needs a `Developer ID Application` certificate in the keychain and notary credentials stored
under the profile name `macstify`:

```sh
xcrun notarytool store-credentials macstify --apple-id you@example.com --team-id TEAMID
```

Override the defaults with `make release CODESIGN_IDENTITY="..." NOTARY_PROFILE="..."`.

## License

[CC0 1.0 Universal](LICENSE).
Loading