Launchday Join waitlist
For devs who ship great native apps

Everything you need
after the code works.

License keys, auto-updates, and app distribution. Without writing or maintaining a line of code.

$ launchday build
◆ Building MyApp 2.1.0… done
◆ Uploading to storage… done
◆ Generating appcast entry… done
◆ Release 2.1.0 live users will auto-update

The part nobody talks about

Building the app is the fun part. Launchday handles everything that comes after.

Ed25519-signed license keys

Cryptographically signed license payloads verified against your app's public key. Each product gets its own Ed25519 key pair, stored encrypted in the database.

  • Device binding with configurable seat limits
  • Expiry and status embedded in signed payload
  • Revoke anytime via dashboard or API

Sparkle appcast for macOS auto-updates

Upload a release and Launchday generates a Sparkle-compatible appcast.xml automatically. Point Sparkle at your namespace URL and auto-updates just work.

  • S3-compatible or local storage backends
  • Yank bad releases with one click
  • Per-platform release tracks

CLI-first release workflow

The launchday CLI drops into your existing build pipeline. Upload artifacts, list releases, yank versions, and run a health check. All from the terminal.

  • launchday upload, releases list, doctor
  • Config via launchday.yaml in your project
  • Works with GitHub Actions and CI/CD

Waitlist and beta management

Collect beta signups with a hosted waitlist, then invite users in batches. Send license keys via email with a single API call. Build your launch audience before day one.

  • Hosted waitlist signup page
  • Batch invite with automated email delivery
  • Per-product waitlist with invite tokens

Up and running in minutes

Three steps from sign-up to shipping signed licenses and auto-updates.

1

Create your product

Register your app in the dashboard. Launchday generates a unique Ed25519 key pair. Your public key goes into your client app.

2

Configure your platform

Add your platforms (macOS, Windows, iOS, and more), set a namespace for each, and wire up storage and email delivery.

3

Integrate in your app

Call the validation endpoint at launch, verify the Ed25519 signature, and you're done. No SDK required — just a few lines of code in any language.

Swift integration

Integrate in minutes,
no SDK required.

Launchday returns a signed JSON payload your app verifies using any Ed25519 library. A few lines of code is all it takes.

  • Ed25519 signature verified with CryptoKit
  • Expiry date and activation status embedded in the payload
  • Device-bound: one key per seat, not shareable
LicenseVerifier.swift
// Verify a Launchday signed payload
func verifyPayload(
  _ response: ValidationResponse,
  publicKeyHex: String
) -> Bool {
  guard
    let pubKeyData = Data(hexString: publicKeyHex),
    let pubKey = try? Curve25519.Signing
      .PublicKey(rawRepresentation: pubKeyData),
    let sigData = Data(hexString: response.signature),
    let payloadData = try? JSONEncoder()
      .encode(response.payload)
  else { return false }

  guard pubKey.isValidSignature(
    sigData, for: payloadData
  ) else { return false }

  return
    response.payload.expiresAt > Date() &&
    response.payload.licenseStatus == "active"
}

Platform support

macOS
iOS
Windows
Linux
Android

Coming soon

Early access

The code works.
Now ship it.

Launchday is invite-only right now. Join the waitlist and we'll reach out when a spot opens up.