Build Mac App — Sell your Mac app without the months of plumbing
The template for paid macOS apps
Sell your Mac app without the months of plumbing.
The complete source for a paid macOS app and the site that sells it: licence keys, notarized releases, Sparkle updates, payments, email and a blog. Every part is tested, and the repository is built to be worked on by AI agents.
Extracted from 3 paid Mac apps already shipped
Before your first sale
12 things between “it runs” and “it sells”.
Each one is time not spent on your app. All of them are already done, tested and wired together.
- Developer ID certificate, hardened runtime, entitlements
- A universal build that launches on Apple silicon and Intel
- notarytool, stapling, and a DMG Gatekeeper opens
- Sparkle, an EdDSA key pair and a signed appcast
- Licence keys: activation per Mac, weekly checks, offline grace
- Payment webhooks, signature checks, refunds that revoke
- Receipts, key recovery and refund emails that arrive once
- SPF, DKIM and DMARC so they do not land in spam
- A site with pricing, terms, privacy and a refund policy
- A download link that follows your latest release
- Canonical URLs, sitemap, OG images, llms.txt
- A changelog that feeds the feed, the appcast and the release notes
~/your-app % mac/scripts/release.sh 1.0.0 1
▸ Preflight
✓ notarytool found
✓ Sparkle linked declared in project.yml
✓ SUPublicEDKey matches the key in the keychain
✓ row for 1.0.0 in the changelog
▸ Building, universal
✓ architectures arm64 x86_64
✓ hardened runtime enabled
▸ Launch smoke on the signed bundle
▸ Submitting to Apple
✓ ticket stapled and validated
✓ Gatekeeper a stranger's Mac will open this
▸ Done here. Two commands left, in this order
One command. It stops before anything irreversible: publishing is yours to run.
Everything a paid Mac app needs, already working together.
Spend your time on the app. The licensing, releases, updates, payments, email and site are done.
Licence keys that never lock out a paying customer
- Activation per Mac, rechecked weekly
- A 14-day offline grace window
- Your misconfiguration says “try again later”, never “invalid licence”
- Lost-key recovery by email, on the site and in the app
- Refunds revoke the key at the provider
One command from source to notarized DMG
- A preflight that checks every credential before a second of build time
- Universal build, signed with the hardened runtime
- Launched on Apple silicon and Intel before it goes to Apple
- Notarized, stapled, and checked the way Gatekeeper checks it
- Locally, or in the included GitHub Actions workflow
Built withXcodeandGitHub Actions
Auto-updates that cannot ship broken
- Sparkle with a per-product EdDSA key
- An appcast signed against the exact bytes of the DMG
- The updater stays off until the key exists
- The preflight refuses a release with the updater compiled out
Built withSparkle
Take money through a merchant of record
- Checkout, webhooks, refunds and disputes behind one contract
- Selected with one setting; switching keeps old keys working
- A shared test suite every provider must pass
- A skill that walks an agent through adding any other provider
- Sell licence keys, GitHub repository access, or both
Built withCreemorPolar
Email that arrives, once
- Receipts, key recovery, refunds, repository access
- Drawn in React Email, with a plain-text twin from the same HTML
- Idempotency keys, so a retried webhook never sends two receipts
- A waitlist and launch broadcasts, drafts by default
- DNS guide for SPF, DKIM and DMARC
Built withResendandReact Email
The site that sells it
- Pricing, terms, privacy, refunds and a changelog
- An answer-first MDX blog with per-post share images
- Sitemap, feed, llms.txt and IndexNow
- Every page renders with nothing configured
- A metadata check that fetches the real pages
Built withNext.jsandTailwind
A repository an agent can find its way around
- Rule books written from real failures
- A machine-readable map of every fact, file and env var
- A doctor that says what state the project is in and what is next
- Checks that report the file, the line and the fix
- Thirteen skills for Claude Code
Built withClaude Code
Your codebase + Claude Code = features, not archaeology.
An agent opens the repository and finds a map, a doctor and rule books written from real failures. Then it has a skill for the job.
~/clip-stack % scripts/doctor.sh
── Your product
ok rename Clip Stack · clipstack.app
── Signing and release
ok signing-identity Developer ID Application
todo sparkle-public-key the updater stays off
→ generate_keys --account clip-stack, once
── Selling
ok provider polar
todo on-sale the site shows a waitlistEvery check reports the file, the line and the fix, so an agent acts instead of guessing.
> /
- /new-appRename it into your product
- /doctorWhat state is this in, what is next
- /add-featureLogic, screen, tests, honest copy
- /add-screenA window, sheet or pane
- /add-settingA preference in Settings
- /add-entitlementA permission, safely
- /add-payment-providerAny provider, held to the suite
- /switch-paymentsCreem ↔ Polar, keys kept
- /add-emailA new email or broadcast
- /add-blog-postSourced, answer-first posts
- /go-liveFrom template to taking money
- /releaseShip a notarized version
- /upgrade-templatePull in template updates
13 skills ship in the repository, one for each job you will actually do.
What broke in real apps, and what now stops it.
From three paid Mac apps shipped on this foundation. Each failure is now caught by a check that runs on every change, so you inherit the lesson without paying for it.
A release shipped with the auto-updater compiled out, and nothing complained.
The release preflight refuses to build unless Sparkle is really declared and the public key matches.
An ad-hoc signed Release build crashed before its first line of code: macOS refused the embedded updater.
Every build is launched on Apple silicon and Intel before it is notarized, and the crash reason is printed.
A two-word product name broke every download: GitHub silently renamed the file.
Release files are named the way GitHub stores them, and the site looks them up by that name.
A rotated API key would have told every paying customer their licence was invalid.
Our own misconfiguration is always “try again later”; a suite holds every payment provider to it.
⌘V did nothing in the licence-key field, because the app had no Edit menu.
The menu is data, installed before any window, and read back out of the running app.
Fourteen buttons did nothing, including both on the first screen a customer sees.
Screen actions are required at compile time, and a check fails on any that could be left empty.
A committed installer layout carried the developer's username and home folder.
Layouts are built in a throwaway folder, and a check scans every committed file for home paths.
A website stuck returning visitors in a theme it no longer offered, with every check green.
There is no theme switch; a test measures contrast and refuses theme overrides.

Hey, it's Dmytro 👋
I make paid Mac apps and sell them myself: MacMemory, Goal Rings and Localdock.
Every one needed the same plumbing before it could take its first payment: signing and notarization, a Sparkle feed, licence keys, webhooks, receipts, a site with terms and a refund policy. And every one broke somewhere in that plumbing, the way the list above shows.
So I stopped rebuilding it. Build Mac App is that plumbing, pulled out into one repository, with a check written for each thing that broke, so it breaks for nobody else.
Build the app. The rest is done.
One price.
Lifetime access.
One-time payment. No subscription. Repository access arrives the moment you buy.
$149
- One-time payment
- 14-day money-back guarantee
- Template updates included
- Unlimited apps you own, no royalties
- 1 developer license
1 developer, $149, one-time payment.
One email when it ships. Nothing else, ever.
Frequently Asked
Questions
What do I get?
Is Build Mac App a subscription?
How many apps can I build with it?
What else do I need?
Does it work with AI coding agents?
How do I get access after buying?
Is there a money-back guarantee?
Ship the app, not the plumbing.
Your next Mac app: signed, notarized, updating itself and taking payments.
