Skip to content
Merged
Show file tree
Hide file tree
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
6 changes: 3 additions & 3 deletions .env.local.example
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@
# --team-id <YOUR_TEAM_ID> \
# --password <app-specific-password>

export PIXI_MACOS_SIGN_APP="Developer ID Application: Your Name (TEAMID)"
export PIXI_MACOS_SIGN_INSTALLER="Developer ID Installer: Your Name (TEAMID)"
export PIXI_MACOS_NOTARY_PROFILE="your-profile-name"
export FIZZY_MACOS_SIGN_APP="Developer ID Application: Your Name (TEAMID)"
export FIZZY_MACOS_SIGN_INSTALLER="Developer ID Installer: Your Name (TEAMID)"
export FIZZY_MACOS_NOTARY_PROFILE="your-profile-name"
54 changes: 27 additions & 27 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,14 @@ name: Release
#
# Signing (optional — falls back to unsigned macOS builds when secrets aren't set):
# Required secrets to enable macOS signing + notarization in CI:
# PIXI_MACOS_CERT_P12_BASE64 - base64-encoded .p12 with Developer ID Application
# FIZZY_MACOS_CERT_P12_BASE64 - base64-encoded .p12 with Developer ID Application
# AND Developer ID Installer certs (combined)
# PIXI_MACOS_CERT_PASSWORD - the password for that .p12
# PIXI_MACOS_SIGN_APP - "Developer ID Application: NAME (TEAMID)"
# PIXI_MACOS_SIGN_INSTALLER - "Developer ID Installer: NAME (TEAMID)"
# PIXI_APPLE_ID - Apple ID email used for notarization
# PIXI_APPLE_APP_PASSWORD - app-specific password (appleid.apple.com)
# PIXI_APPLE_TEAM_ID - 10-char team ID
# FIZZY_MACOS_CERT_PASSWORD - the password for that .p12
# FIZZY_MACOS_SIGN_APP - "Developer ID Application: NAME (TEAMID)"
# FIZZY_MACOS_SIGN_INSTALLER - "Developer ID Installer: NAME (TEAMID)"
# FIZZY_APPLE_ID - Apple ID email used for notarization
# FIZZY_APPLE_APP_PASSWORD - app-specific password (appleid.apple.com)
# FIZZY_APPLE_TEAM_ID - 10-char team ID
#
# GITHUB_TOKEN is provided automatically by Actions; the job sets GH_TOKEN so
# `gh` in scripts/release.sh is authenticated without a separate login step.
Expand All @@ -51,9 +51,9 @@ env:
jobs:
release:
runs-on: macos-latest
# Secrets for signing/notarization live in Settings → Environments → pixi_release
# Secrets for signing/notarization live in Settings → Environments → fizzy_release
# (repository-level Actions secrets work too if you prefer).
environment: pixi_release
environment: fizzy_release
permissions:
contents: write # required for `gh release create`

Expand Down Expand Up @@ -142,7 +142,7 @@ jobs:
# ----- macOS signing setup (optional) ------------------------------
# If the cert secrets are configured, import them into a temporary
# keychain that lives only for this job. If not, skip — release.sh
# detects unset PIXI_MACOS_SIGN_APP and produces unsigned builds.
# detects unset FIZZY_MACOS_SIGN_APP and produces unsigned builds.
#
# Why the indirection via `signing_config` outputs instead of just
# `if: ${{ secrets.X != '' }}`: workflow validation fails with
Expand All @@ -165,41 +165,41 @@ jobs:
- name: Check signing config
id: signing_config
env:
HAS_CERT: ${{ secrets.PIXI_MACOS_CERT_P12_BASE64 != '' }}
HAS_NOTARY: ${{ secrets.PIXI_APPLE_ID != '' }}
HAS_CERT: ${{ secrets.FIZZY_MACOS_CERT_P12_BASE64 != '' }}
HAS_NOTARY: ${{ secrets.FIZZY_APPLE_ID != '' }}
run: |
echo "cert=$HAS_CERT" >> "$GITHUB_OUTPUT"
echo "notary=$HAS_NOTARY" >> "$GITHUB_OUTPUT"
if [[ "$HAS_CERT" == "true" ]]; then
echo "macOS signing: ENABLED"
else
echo "macOS signing: disabled (PIXI_MACOS_CERT_P12_BASE64 not set)"
echo "macOS signing: disabled (FIZZY_MACOS_CERT_P12_BASE64 not set)"
fi
if [[ "$HAS_NOTARY" == "true" ]]; then
echo "Notarization: ENABLED"
else
echo "Notarization: disabled (PIXI_APPLE_ID not set)"
echo "Notarization: disabled (FIZZY_APPLE_ID not set)"
fi

- name: Import signing certificate
if: steps.signing_config.outputs.cert == 'true'
uses: apple-actions/import-codesign-certs@v3
with:
p12-file-base64: ${{ secrets.PIXI_MACOS_CERT_P12_BASE64 }}
p12-password: ${{ secrets.PIXI_MACOS_CERT_PASSWORD }}
p12-file-base64: ${{ secrets.FIZZY_MACOS_CERT_P12_BASE64 }}
p12-password: ${{ secrets.FIZZY_MACOS_CERT_PASSWORD }}
# One-shot keychain unique to this job; torn down at job end.
keychain: pixi-release
keychain: fizzy-release
create-keychain: true

- name: Configure notarytool credentials
if: steps.signing_config.outputs.notary == 'true'
env:
APPLE_ID: ${{ secrets.PIXI_APPLE_ID }}
APPLE_APP_PASSWORD: ${{ secrets.PIXI_APPLE_APP_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.PIXI_APPLE_TEAM_ID }}
APPLE_ID: ${{ secrets.FIZZY_APPLE_ID }}
APPLE_APP_PASSWORD: ${{ secrets.FIZZY_APPLE_APP_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.FIZZY_APPLE_TEAM_ID }}
run: |
set -euo pipefail
xcrun notarytool store-credentials "pixi-ci-notary" \
xcrun notarytool store-credentials "fizzy-ci-notary" \
--apple-id "$APPLE_ID" \
--password "$APPLE_APP_PASSWORD" \
--team-id "$APPLE_TEAM_ID"
Expand All @@ -209,18 +209,18 @@ jobs:
# `secrets.*` expression, which fails validation under
# `environment:`. This way the env var only exists when the
# profile was actually created, which is what release.sh expects.
echo "PIXI_MACOS_NOTARY_PROFILE=pixi-ci-notary" >> "$GITHUB_ENV"
echo "FIZZY_MACOS_NOTARY_PROFILE=fizzy-ci-notary" >> "$GITHUB_ENV"

# ----- run the release ---------------------------------------------

- name: Run release script
env:
PIXI_MACOS_SIGN_APP: ${{ secrets.PIXI_MACOS_SIGN_APP }}
PIXI_MACOS_SIGN_INSTALLER: ${{ secrets.PIXI_MACOS_SIGN_INSTALLER }}
# PIXI_MACOS_NOTARY_PROFILE is set by the notarytool step via
FIZZY_MACOS_SIGN_APP: ${{ secrets.FIZZY_MACOS_SIGN_APP }}
FIZZY_MACOS_SIGN_INSTALLER: ${{ secrets.FIZZY_MACOS_SIGN_INSTALLER }}
# FIZZY_MACOS_NOTARY_PROFILE is set by the notarytool step via
# $GITHUB_ENV when notarization is enabled, otherwise it stays
# unset and release.sh skips the --notaryProfile vpk flag.
# Leave the release as a draft so the operator publishes manually.
# Set PIXI_RELEASE_PUBLISH=1 here once you trust the pipeline end-to-end.
PIXI_RELEASE_PUBLISH: "0"
# Set FIZZY_RELEASE_PUBLISH=1 here once you trust the pipeline end-to-end.
FIZZY_RELEASE_PUBLISH: "0"
run: ./scripts/release.sh
4 changes: 2 additions & 2 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,15 @@
"name": "Debug (arm64 macOS)",
"type": "lldb-mi",
"request": "launch",
"target": "${workspaceFolder}/zig-out/arm64-macos/Pixi",
"target": "${workspaceFolder}/zig-out/arm64-macos/Fizzy",
"cwd": "${workspaceFolder}",
"valuesFormatting": "parseText"
},
{
"name": "Debug (x86_64 macOS)",
"type": "lldb-mi",
"request": "launch",
"target": "${workspaceFolder}/zig-out/x86-64-macos/Pixi",
"target": "${workspaceFolder}/zig-out/x86-64-macos/Fizzy",
"cwd": "${workspaceFolder}",
"valuesFormatting": "parseText"
}
Expand Down
62 changes: 31 additions & 31 deletions RELEASING.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
# Releasing pixi
# Releasing fizzy

Pixi ships installers for six targets via [Velopack](https://velopack.io):
Fizzy ships installers for six targets via [Velopack](https://velopack.io):

| Channel | OS | Arch | Installer |
| -------------------- | ------- | ------- | ------------------------------- |
| `x86-64-linux` | Linux | x86_64 | `pixi_linux_x86_64.AppImage` |
| `arm64-linux` | Linux | arm64 | `pixi_linux_arm64.AppImage` |
| `x86-64-macos` | macOS | x86_64 | `pixi_macos_x86_64.pkg` |
| `arm64-macos` | macOS | arm64 | `pixi_macos_arm64.pkg` |
| `x86-64-windows` | Windows | x86_64 | `pixi_windows_x86_64.exe` |
| `arm64-windows` | Windows | arm64 | `pixi_windows_arm64.exe` |
| `x86-64-linux` | Linux | x86_64 | `fizzy_linux_x86_64.AppImage` |
| `arm64-linux` | Linux | arm64 | `fizzy_linux_arm64.AppImage` |
| `x86-64-macos` | macOS | x86_64 | `fizzy_macos_x86_64.pkg` |
| `arm64-macos` | macOS | arm64 | `fizzy_macos_arm64.pkg` |
| `x86-64-windows` | Windows | x86_64 | `fizzy_windows_x86_64.exe` |
| `arm64-windows` | Windows | arm64 | `fizzy_windows_arm64.exe` |

Channel strings use hyphens only (no underscores): Velopack parses
`<version>-<channel>-…` as a NuGet version, and NuGet disallows `_` in the
Expand All @@ -26,21 +26,21 @@ asset names uploaded to releases.
The `VERSION` file at the repo root is the single source of truth.
`build.zig` reads it, plumbs it through `build_opts.app_version`, and passes
it to `vpk pack --packVersion`. The running binary logs it at startup
(`Pixi version 0.0.3`). Override at build time with `-Dapp_version=0.0.4`
(`Fizzy version 0.0.3`). Override at build time with `-Dapp_version=0.0.4`
only for one-off experiments — don't release with a mismatched VERSION file.

## How auto-update works

The Velopack runtime in each binary calls the GitHub Releases API on the URL
baked in at build time (`-Drepo-url`, default `https://github.com/foxnne/pixi`).
baked in at build time (`-Drepo-url`, default `https://github.com/foxnne/fizzy`).
It looks at the latest non-prerelease release for assets matching its own
channel and downloads the `*-<channel>-full.nupkg`. The `releases.<channel>.json`
manifest tells it which nupkg is current.

For this to work, **three files per channel** must be present on the release:

1. The renamed installer (`pixi_<os>_<arch>.<ext>`) — what humans download.
2. `pixi-<version>-<channel>-full.nupkg` — the actual update payload Velopack
1. The renamed installer (`fizzy_<os>_<arch>.<ext>`) — what humans download.
2. `fizzy-<version>-<channel>-full.nupkg` — the actual update payload Velopack
downloads and applies.
3. `releases.<channel>.json` (or `RELEASES-<channel>` on older vpk) — the
manifest that tells Velopack which nupkg version is current.
Expand Down Expand Up @@ -81,9 +81,9 @@ If you'd rather drive the release from your Mac (uses your local Keychain
for signing, no CI secrets needed):

```sh
export PIXI_MACOS_SIGN_APP="Developer ID Application: Your Name (TEAMID)"
export PIXI_MACOS_SIGN_INSTALLER="Developer ID Installer: Your Name (TEAMID)"
export PIXI_MACOS_NOTARY_PROFILE="pixi-notary" # see one-time setup below
export FIZZY_MACOS_SIGN_APP="Developer ID Application: Your Name (TEAMID)"
export FIZZY_MACOS_SIGN_INSTALLER="Developer ID Installer: Your Name (TEAMID)"
export FIZZY_MACOS_NOTARY_PROFILE="fizzy-notary" # see one-time setup below

./scripts/release.sh
```
Expand All @@ -94,7 +94,7 @@ the certs in your login Keychain.
It's safe to run after CI has already run — the script uses `gh release
upload --clobber` to overwrite existing assets on the same draft release.

Set `PIXI_RELEASE_PUBLISH=1` if you want the script to publish automatically
Set `FIZZY_RELEASE_PUBLISH=1` if you want the script to publish automatically
instead of leaving it as a draft.

## One-time setup
Expand All @@ -116,7 +116,7 @@ security find-identity -v -p codesigning
Then create a `notarytool` profile so notarization runs without prompts:

```sh
xcrun notarytool store-credentials pixi-notary \
xcrun notarytool store-credentials fizzy-notary \
--apple-id "you@example.com" \
--team-id "TEAMID" \
--password "<app-specific password>"
Expand All @@ -129,27 +129,27 @@ right of <https://developer.apple.com/account>.
Export these into your shell (e.g. in `~/.zshrc`):

```sh
export PIXI_MACOS_SIGN_APP="Developer ID Application: Your Name (TEAMID)"
export PIXI_MACOS_SIGN_INSTALLER="Developer ID Installer: Your Name (TEAMID)"
export PIXI_MACOS_NOTARY_PROFILE="pixi-notary"
export FIZZY_MACOS_SIGN_APP="Developer ID Application: Your Name (TEAMID)"
export FIZZY_MACOS_SIGN_INSTALLER="Developer ID Installer: Your Name (TEAMID)"
export FIZZY_MACOS_NOTARY_PROFILE="fizzy-notary"
```

### CI signing (optional)

If you want CI to sign instead of you, set the following secrets (either on
the repo under **Settings → Secrets and variables → Actions**, or on an
**environment** — the release workflow uses the environment **`pixi_release`**,
**environment** — the release workflow uses the environment **`fizzy_release`**,
so you can store them there for stricter access / required reviewers):

| Secret | What it is |
| ----------------------------- | ---------------------------------------------------------- |
| `PIXI_MACOS_CERT_P12_BASE64` | `base64 < combined.p12` of both Developer ID certs |
| `PIXI_MACOS_CERT_PASSWORD` | password for the `.p12` |
| `PIXI_MACOS_SIGN_APP` | "Developer ID Application: NAME (TEAMID)" |
| `PIXI_MACOS_SIGN_INSTALLER` | "Developer ID Installer: NAME (TEAMID)" |
| `PIXI_APPLE_ID` | Apple ID email |
| `PIXI_APPLE_APP_PASSWORD` | app-specific password |
| `PIXI_APPLE_TEAM_ID` | 10-character team ID |
| `FIZZY_MACOS_CERT_P12_BASE64` | `base64 < combined.p12` of both Developer ID certs |
| `FIZZY_MACOS_CERT_PASSWORD` | password for the `.p12` |
| `FIZZY_MACOS_SIGN_APP` | "Developer ID Application: NAME (TEAMID)" |
| `FIZZY_MACOS_SIGN_INSTALLER` | "Developer ID Installer: NAME (TEAMID)" |
| `FIZZY_APPLE_ID` | Apple ID email |
| `FIZZY_APPLE_APP_PASSWORD` | app-specific password |
| `FIZZY_APPLE_TEAM_ID` | 10-character team ID |

To bundle both certs into one `.p12`, in Keychain Access select both
identities (Cmd-click) → File → Export Items → Personal Information Exchange
Expand All @@ -166,7 +166,7 @@ There are two paths:
point a built copy at the local output dir:

```sh
PIXI_AUTOUPDATE_URL="$PWD/zig-out/x86-64-macos" ./zig-out/x86-64-macos/Pixi
FIZZY_AUTOUPDATE_URL="$PWD/zig-out/x86-64-macos" ./zig-out/x86-64-macos/Fizzy
```

This bypasses GitHub entirely and reads the `releases.*.json` straight
Expand All @@ -186,12 +186,12 @@ reaching `api.github.com`, or a malformed repo URL. The URL must be

**Velopack reports no update available** when you expect one: most often
the channel embedded in the running binary doesn't match the `--channel`
that produced the release assets. Check `Pixi.app/Contents/Resources/`
that produced the release assets. Check `Fizzy.app/Contents/Resources/`
(macOS) or the `sq.version` file inside a Setup zip for the channel name
the binary will request.

**Notarization rejected with "signature does not include a secure
timestamp"**: signing was done without `--signEntitlements`. The build.zig
already passes the entitlements file when `PIXI_MACOS_SIGN_APP` is set;
already passes the entitlements file when `FIZZY_MACOS_SIGN_APP` is set;
make sure that env var is exported when running `zig build package`
directly (the release script handles this for you).
1 change: 1 addition & 0 deletions assets/.fizproject
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"packed_image_output":"/Users/foxnne/dev/proj/pixi/assets/fizzy.png","packed_atlas_output":"/Users/foxnne/dev/proj/pixi/assets/fizzy.atlas","pack_on_save":true}
1 change: 0 additions & 1 deletion assets/.pixiproject

This file was deleted.

2 changes: 1 addition & 1 deletion assets/pixi.atlas → assets/fizzy.atlas
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"sprites":[{"origin":[0,22],"source":[240,0,14,18]},{"origin":[0,22],"source":[92,0,22,22]},{"origin":[0,22],"source":[48,0,22,22]},{"origin":[0,14],"source":[129,21,15,16]},{"origin":[-1,21],"source":[220,0,20,20]},{"origin":[-1,21],"source":[180,0,20,20]},{"origin":[-1,21],"source":[200,0,20,20]},{"origin":[0,21],"source":[138,0,21,21]},{"origin":[0,21],"source":[159,0,21,21]},{"origin":[0,21],"source":[114,0,24,21]},{"origin":[0,14],"source":[114,21,15,16]},{"origin":[0,14],"source":[207,20,24,17]},{"origin":[0,14],"source":[231,20,24,16]},{"origin":[0,22],"source":[70,0,22,22]},{"origin":[0,22],"source":[0,0,24,22]},{"origin":[0,22],"source":[24,0,24,22]},{"origin":[3,20],"source":[180,20,27,18]},{"origin":[-10,13],"source":[144,21,3,5]}],"animations":[{"name":"cursor_default","frames":[{"sprite_index":0,"ms":1000}]},{"name":"pencil_default","frames":[{"sprite_index":1,"ms":1000}]},{"name":"eraser_default","frames":[{"sprite_index":2,"ms":1000}]},{"name":"bucket_default","frames":[{"sprite_index":3,"ms":1000}]},{"name":"box_selection_default","frames":[{"sprite_index":4,"ms":1000}]},{"name":"box_selection_add_default","frames":[{"sprite_index":5,"ms":1000}]},{"name":"box_selection_rem_default","frames":[{"sprite_index":6,"ms":1000}]},{"name":"color_selection_default","frames":[{"sprite_index":10,"ms":1000}]},{"name":"color_selection_add_default","frames":[{"sprite_index":11,"ms":1000}]},{"name":"color_selection_rem_default","frames":[{"sprite_index":12,"ms":1000}]},{"name":"pixel_selection_default","frames":[{"sprite_index":13,"ms":1000}]},{"name":"pixel_selection_add_default","frames":[{"sprite_index":14,"ms":1000}]},{"name":"pixel_selection_rem_default","frames":[{"sprite_index":15,"ms":1000}]},{"name":"fox_default","frames":[{"sprite_index":16,"ms":125}]},{"name":"logo_default","frames":[{"sprite_index":17,"ms":1000}]}]}
{"sprites":[{"origin":[0,22],"source":[240,0,14,18]},{"origin":[0,22],"source":[92,0,22,22]},{"origin":[0,22],"source":[48,0,22,22]},{"origin":[0,14],"source":[129,21,15,16]},{"origin":[-1,21],"source":[220,0,20,20]},{"origin":[-1,21],"source":[180,0,20,20]},{"origin":[-1,21],"source":[200,0,20,20]},{"origin":[0,21],"source":[138,0,21,21]},{"origin":[0,21],"source":[159,0,21,21]},{"origin":[0,21],"source":[114,0,24,21]},{"origin":[0,14],"source":[114,21,15,16]},{"origin":[0,14],"source":[207,20,24,17]},{"origin":[0,14],"source":[231,20,24,16]},{"origin":[0,22],"source":[70,0,22,22]},{"origin":[0,22],"source":[0,0,24,22]},{"origin":[0,22],"source":[24,0,24,22]},{"origin":[3,20],"source":[180,20,27,18]},{"origin":[-10,13],"source":[144,21,3,4]}],"animations":[{"name":"cursor_default","frames":[{"sprite_index":0,"ms":1000}]},{"name":"pencil_default","frames":[{"sprite_index":1,"ms":1000}]},{"name":"eraser_default","frames":[{"sprite_index":2,"ms":1000}]},{"name":"bucket_default","frames":[{"sprite_index":3,"ms":1000}]},{"name":"box_selection_default","frames":[{"sprite_index":4,"ms":1000}]},{"name":"box_selection_add_default","frames":[{"sprite_index":5,"ms":1000}]},{"name":"box_selection_rem_default","frames":[{"sprite_index":6,"ms":1000}]},{"name":"color_selection_default","frames":[{"sprite_index":10,"ms":1000}]},{"name":"color_selection_add_default","frames":[{"sprite_index":11,"ms":1000}]},{"name":"color_selection_rem_default","frames":[{"sprite_index":12,"ms":1000}]},{"name":"pixel_selection_default","frames":[{"sprite_index":13,"ms":1000}]},{"name":"pixel_selection_add_default","frames":[{"sprite_index":14,"ms":1000}]},{"name":"pixel_selection_rem_default","frames":[{"sprite_index":15,"ms":1000}]},{"name":"fox_default","frames":[{"sprite_index":16,"ms":125}]},{"name":"logo_default","frames":[{"sprite_index":17,"ms":1000}]}]}
Binary file added assets/fizzy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/icon.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading