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
69 changes: 56 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,24 +14,67 @@ of [`munki-pkg`](https://github.com/munki/munki-pkg). `Swiftpkgr` is its native
macOS desktop app. Both frontends use the same `SwiftPkgCore` package engine and
open the same portable projects.

## Install swiftpkg and Swiftpkgr
## Quick start

Download `SHA256SUMS` and the appropriate signed, notarized artifact from the
matching GitHub Release:
Install the CLI and desktop app independently from the official
[`codecarton/homebrew-tap`](https://github.com/codecarton/homebrew-tap):

- `swiftpkg-<version>-combined.pkg` installs both the CLI and Swiftpkgr and
requires macOS 15 or later.
- `swiftpkg-<version>-cli.pkg` installs only the CLI and requires macOS 13 or
later.
- `Swiftpkgr-<version>.zip` contains only the macOS 15+ app.
```sh
brew install codecarton/tap/swiftpkg
brew install --cask codecarton/tap/swiftpkgr
swiftpkg --version
```

The `swiftpkg` formula requires macOS 13 or later. The `swiftpkgr` cask requires
macOS 15 or later and installs `Swiftpkgr.app` in `/Applications`.

Create and build your first package project:

```sh
swiftpkg --create MyPackage
swiftpkg MyPackage
```

Open `MyPackage` in Swiftpkgr whenever you want to edit or build the same
project visually. Keep both tools current through Homebrew:

```sh
brew update
brew upgrade swiftpkg
brew upgrade --cask swiftpkgr
```

Remove either tool independently:

```sh
brew uninstall swiftpkg
brew uninstall --cask swiftpkgr
```

## Signed release downloads

The signed and notarized
[swiftpkg 0.3.1 release](https://github.com/codecarton/swiftpkg/releases/tag/v0.3.1)
provides these immutable resources:

- [`swiftpkg-0.3.1-combined.pkg`](https://github.com/codecarton/swiftpkg/releases/download/v0.3.1/swiftpkg-0.3.1-combined.pkg)
installs both the CLI and Swiftpkgr and requires macOS 15 or later.
- [`swiftpkg-0.3.1-cli.pkg`](https://github.com/codecarton/swiftpkg/releases/download/v0.3.1/swiftpkg-0.3.1-cli.pkg)
installs only the CLI and requires macOS 13 or later.
- [`Swiftpkgr-0.3.1.zip`](https://github.com/codecarton/swiftpkg/releases/download/v0.3.1/Swiftpkgr-0.3.1.zip)
contains only the macOS 15+ app.
- [`swiftpkg-0.3.1-universal.tar.gz`](https://github.com/codecarton/swiftpkg/releases/download/v0.3.1/swiftpkg-0.3.1-universal.tar.gz)
is the Universal 2 CLI archive consumed by the Homebrew formula.
- [`SHA256SUMS`](https://github.com/codecarton/swiftpkg/releases/download/v0.3.1/SHA256SUMS)
covers every downloadable release artifact.

Verify a package download before installation:

```sh
grep ' swiftpkg-<version>-combined.pkg$' SHA256SUMS | shasum -a 256 -c -
pkgutil --check-signature swiftpkg-<version>-combined.pkg
xcrun stapler validate swiftpkg-<version>-combined.pkg
sudo installer -pkg swiftpkg-<version>-combined.pkg -target /
grep ' swiftpkg-0.3.1-combined.pkg$' SHA256SUMS | shasum -a 256 -c -
pkgutil --check-signature swiftpkg-0.3.1-combined.pkg
xcrun stapler validate swiftpkg-0.3.1-combined.pkg
sudo installer -pkg swiftpkg-0.3.1-combined.pkg -target /
swiftpkg --version
```

Expand All @@ -41,7 +84,7 @@ Jamf Pro, or another management system; do not repackage its contents. Use the
CLI package when managed Macs do not need the app. The ZIP can be expanded and
`Swiftpkgr.app` moved to `/Applications` for an app-only installation.

To uninstall, remove `/usr/local/bin/swiftpkg` and
To uninstall a package-based installation, remove `/usr/local/bin/swiftpkg` and
`/Applications/Swiftpkgr.app`, then optionally forget the
`com.codecarton.swiftpkg.installer` or
`com.codecarton.swiftpkg.cli.installer` receipt after confirming it is not
Expand Down
57 changes: 48 additions & 9 deletions site/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,19 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Build dependable macOS installer packages from the swiftpkg CLI or the native Swiftpkgr desktop app.">
<meta name="description" content="Install swiftpkg and Swiftpkgr with Homebrew, then build dependable macOS installer packages from the command line or native desktop app.">
<meta name="theme-color" content="#f2f0e8">
<meta property="og:type" content="website">
<meta property="og:title" content="swiftpkg — Build better macOS installer packages">
<meta property="og:description" content="One portable package workflow for the swiftpkg CLI and native Swiftpkgr desktop app.">
<meta property="og:description" content="Install with Homebrew. Build from the swiftpkg CLI or native Swiftpkgr desktop app.">
<meta property="og:url" content="https://codecarton.github.io/swiftpkg/">
<meta property="og:image" content="https://codecarton.github.io/swiftpkg/assets/og.png">
<meta property="og:image:width" content="1731">
<meta property="og:image:height" content="909">
<meta property="og:image:alt" content="swiftpkg shown beside a precise charcoal package-build control panel with an orange status control.">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="swiftpkg — Build better macOS installer packages">
<meta name="twitter:description" content="One portable package workflow for the swiftpkg CLI and native Swiftpkgr desktop app.">
<meta name="twitter:description" content="Install with Homebrew. Build from the swiftpkg CLI or native Swiftpkgr desktop app.">
<meta name="twitter:image" content="https://codecarton.github.io/swiftpkg/assets/og.png">
<title>swiftpkg — macOS package building, without the noise</title>
<link rel="stylesheet" href="styles.css">
Expand All @@ -28,6 +28,7 @@
<span>swiftpkg</span>
</a>
<nav aria-label="Primary navigation">
<a href="#install">Install</a>
<a href="#workflow">How it works</a>
<a href="#desktop-app">Desktop app</a>
<a href="#built-for-admins">Why swiftpkg</a>
Expand All @@ -41,9 +42,9 @@
<div class="hero-copy">
<p class="eyebrow"><span></span> macOS packaging, made practical</p>
<h1>The munki-pkg<br>workflow, rebuilt<br><em>in Swift</em></h1>
<p class="lede">Build from the command line or open the same project in Swiftpkgr, the native desktop app included with swiftpkg 0.3.0.</p>
<p class="lede">Install swiftpkg 0.3.1 with Homebrew, then build from the command line or open the same project in the native Swiftpkgr desktop app.</p>
<div class="hero-actions">
<a class="button button-primary" href="https://github.com/codecarton/swiftpkg/releases/latest">Get swiftpkg <span aria-hidden="true">→</span></a>
<a class="button button-primary" href="#install">Install swiftpkg <span aria-hidden="true">↓</span></a>
<a class="button button-quiet" href="#workflow">See the workflow <span aria-hidden="true">↓</span></a>
</div>
<p class="availability"><span class="status-dot" aria-hidden="true"></span> CLI macOS 13+ · Swiftpkgr macOS 15+ · Universal 2</p>
Expand All @@ -68,6 +69,44 @@ <h1>The munki-pkg<br>workflow, rebuilt<br><em>in Swift</em></h1>
<div><strong>0</strong><span>proprietary<br>formats</span></div>
</section>

<section class="install section" id="install">
<div class="section-intro">
<p class="eyebrow"><span></span> Available through Homebrew</p>
<h2>Two tools.<br>One quick install.</h2>
<p>Install the CLI and desktop app independently from the official tap. Both use the same package engine and portable project format.</p>
</div>
<div class="install-grid">
<article class="install-card">
<p class="install-label">CLI · macOS 13+</p>
<h3>swiftpkg</h3>
<p>Build, import, and synchronize package projects from scripts or your terminal.</p>
<code><span>$</span> brew install codecarton/tap/swiftpkg</code>
<a href="https://github.com/codecarton/swiftpkg/releases/download/v0.3.1/swiftpkg-0.3.1-cli.pkg">Download the signed CLI package <span aria-hidden="true">↗</span></a>
</article>
<article class="install-card">
<p class="install-label">Desktop app · macOS 15+</p>
<h3>Swiftpkgr</h3>
<p>Create, edit, and build the same package projects in a focused native workspace.</p>
<code><span>$</span> brew install --cask codecarton/tap/swiftpkgr</code>
<a href="https://github.com/codecarton/swiftpkg/releases/download/v0.3.1/Swiftpkgr-0.3.1.zip">Download the signed app archive <span aria-hidden="true">↗</span></a>
</article>
</div>
<div class="release-resources">
<div>
<b>swiftpkg 0.3.1 release resources</b>
<span>Signed, notarized, checksummed, and ready for direct or managed deployment.</span>
</div>
<nav aria-label="swiftpkg 0.3.1 release resources">
<a href="https://github.com/codecarton/swiftpkg/releases/download/v0.3.1/swiftpkg-0.3.1-combined.pkg">Combined installer</a>
<a href="https://github.com/codecarton/swiftpkg/releases/download/v0.3.1/swiftpkg-0.3.1-cli.pkg">CLI installer</a>
<a href="https://github.com/codecarton/swiftpkg/releases/download/v0.3.1/Swiftpkgr-0.3.1.zip">App ZIP</a>
<a href="https://github.com/codecarton/swiftpkg/releases/download/v0.3.1/swiftpkg-0.3.1-universal.tar.gz">CLI archive</a>
<a href="https://github.com/codecarton/swiftpkg/releases/download/v0.3.1/SHA256SUMS">SHA256SUMS</a>
<a href="https://github.com/codecarton/swiftpkg/releases/tag/v0.3.1">Release notes <span aria-hidden="true">↗</span></a>
</nav>
</div>
</section>

<section class="workflow section" id="workflow">
<div class="section-intro">
<p class="eyebrow"><span></span> A familiar workflow</p>
Expand Down Expand Up @@ -98,15 +137,15 @@ <h3>Build with confidence</h3>

<section class="desktop section" id="desktop-app">
<div class="desktop-copy">
<p class="eyebrow"><span></span> Included in 0.3.0 · Meet Swiftpkgr</p>
<p class="eyebrow"><span></span> Available in 0.3.1 · Meet Swiftpkgr</p>
<h2>A desktop workspace<br>for package projects.</h2>
<p>Swiftpkgr brings the same package engine and portable project format into a native macOS app. Create a project, import an existing installer, edit its settings, and follow the build from one focused workspace.</p>
<ul>
<li><b>Edit with confidence</b><span>Work with package, distribution, signing, and notarization settings in a structured editor.</span></li>
<li><b>Move between app and CLI</b><span>Open the same plist, JSON, or YAML projects without converting them to a proprietary format.</span></li>
<li><b>See the work happen</b><span>Build packages and follow operation progress without leaving the app.</span></li>
</ul>
<p class="desktop-availability">Swiftpkgr requires macOS 15 or later and is included with the signed and notarized swiftpkg 0.3.0 installer.</p>
<p class="desktop-availability">Swiftpkgr requires macOS 15 or later. Install it with the Homebrew cask, the signed app ZIP, or the combined swiftpkg 0.3.1 installer.</p>
</div>
<div class="app-window glow-panel" aria-label="Swiftpkgr desktop app preview">
<div class="app-titlebar">
Expand Down Expand Up @@ -167,8 +206,8 @@ <h2>Native to macOS.<br>Ready for your fleet.</h2>
<section class="closing">
<p class="eyebrow"><span></span> Follow the project</p>
<h2>Your next package<br>deserves a better build.</h2>
<p>Download the signed installer from GitHub and choose the CLI or Swiftpkgr whenever the work calls for it.</p>
<a class="button button-primary" href="https://github.com/codecarton/swiftpkg/releases/latest">Get swiftpkg 0.3.0 <span aria-hidden="true">↗</span></a>
<p>Install with Homebrew or download the signed 0.3.1 release, then choose the CLI or Swiftpkgr whenever the work calls for it.</p>
<a class="button button-primary" href="https://github.com/codecarton/swiftpkg/releases/tag/v0.3.1">Get swiftpkg 0.3.1 <span aria-hidden="true">↗</span></a>
</section>
</main>

Expand Down
129 changes: 129 additions & 0 deletions site/styles.css
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,126 @@ footer a:hover { color: var(--orange-dark); }
line-height: 1.65;
}

.install {
padding-top: 120px;
padding-bottom: 120px;
}

.install-grid {
margin-top: 62px;
display: grid;
grid-template-columns: repeat(2, 1fr);
border-top: 1px solid var(--line);
border-bottom: 1px solid var(--line);
}

.install-card {
min-width: 0;
padding: 32px 34px 31px 0;
}

.install-card + .install-card {
padding-left: 34px;
border-left: 1px solid var(--line);
}

.install-label {
margin: 0 0 16px;
color: var(--orange-dark);
font: 700 .64rem ui-monospace, SFMono-Regular, Menlo, monospace;
letter-spacing: .1em;
text-transform: uppercase;
}

.install-card h3 {
margin: 0;
font-size: 1.75rem;
letter-spacing: -.045em;
}

.install-card > p:not(.install-label) {
max-width: 430px;
min-height: 48px;
color: var(--muted);
font-size: .85rem;
line-height: 1.55;
}

.install-card code {
margin: 23px 0 18px;
padding: 14px 15px;
display: block;
overflow-x: auto;
background: var(--panel);
color: #f5f2e9;
border-left: 3px solid var(--orange);
font: 500 .72rem/1.5 ui-monospace, SFMono-Regular, Menlo, monospace;
white-space: nowrap;
}

.install-card code span { color: #a9a79f; }

.install-card > a {
color: #55524b;
font-size: .75rem;
font-weight: 650;
text-decoration: underline;
text-decoration-color: #b8b3a7;
text-underline-offset: 4px;
}

.install-card > a:hover { color: var(--orange-dark); }

.release-resources {
padding-top: 27px;
display: flex;
justify-content: space-between;
align-items: flex-start;
gap: 35px;
}

.release-resources > div {
max-width: 360px;
flex: 0 0 auto;
}

.release-resources > div b,
.release-resources > div span {
display: block;
}

.release-resources b {
font-size: .85rem;
letter-spacing: -.015em;
}

.release-resources > div span {
margin-top: 5px;
color: #77746c;
font-size: .71rem;
line-height: 1.5;
}

.release-resources nav {
max-width: 650px;
display: flex;
justify-content: flex-end;
flex-wrap: wrap;
gap: 8px 19px;
color: #55524b;
font-size: .72rem;
}

.release-resources nav a {
text-decoration: underline;
text-decoration-color: #b8b3a7;
text-underline-offset: 4px;
}

.release-resources nav a:hover { color: var(--orange-dark); }

.workflow { border-top: 1px solid var(--line); }

.steps {
margin: 0;
padding: 66px 0 0;
Expand Down Expand Up @@ -811,6 +931,14 @@ footer div { display: flex; gap: 18px; }
.proof div { gap: 9px; }
.proof div + div { padding-left: 13px; }
.section { padding: 100px 20px; }
.install-grid { grid-template-columns: 1fr; }
.install-card,
.install-card + .install-card { padding: 27px 0; border-left: 0; }
.install-card + .install-card { border-top: 1px solid var(--line); }
.install-card > p:not(.install-label) { min-height: 0; }
.release-resources { flex-direction: column; gap: 20px; }
.release-resources > div { max-width: 490px; }
.release-resources nav { justify-content: flex-start; }
.steps { grid-template-columns: 1fr; padding-top: 38px; }
.steps li,
.steps li + li { min-height: auto; padding: 25px 0; border-left: 0; }
Expand All @@ -836,6 +964,7 @@ footer div { display: flex; gap: 18px; }
.glow-panel { box-shadow: 7px 7px 0 #d9d5ca; }
.proof strong { font-size: 1.7rem; }
.proof span { font-size: .55rem; letter-spacing: .07em; }
.install-card code { font-size: .64rem; }
.app-content { grid-template-columns: 108px 1fr; }
.app-editor { padding: 24px 14px; }
.build-row button { padding: 8px; }
Expand Down