Module 8 of 10
Phone and desktop apps
A video for this module is coming.
Most apps never need an app store. Your Shipyard app can already be added to a phone's home screen. If you still want a store app, Shipyard wraps your live site in a thin app and checks it for common store problems.
What you'll do
You will decide whether you really need a store app, add a phone or desktop wrapper if you do, run the store check, and learn what each store charges and requires. Shipyard does not publish to the stores for you. You create the store accounts and pay the fees yourself.
Prices and rules in this module are as of October 2026. Stores change them often, so check the store pages before relying on any of it.
Start with the installable web app
Every Shipyard app is a PWA, an installable web app, unless you chose not to make it installable. On a phone, a visitor can add it to the home screen, and it opens like an app. It costs nothing and needs no review. Ask yourself why you want the store. If it is discoverability or push notifications, a store app may help. If it is only that it should feel real, stay with the installable web app.
What a wrapper is
- Phone: a thin iPhone and Android app, built with Capacitor, that shows your live website inside it.
- Desktop: a Mac and Windows window built with Electron that shows your live website, plus a GitHub workflow that builds the installers.
Because they show your live site, the site must already be live on a stable HTTPS address, ideally your own domain (module 5). The stores also require a privacy page and a way to delete an account in the app. The Shipyard template already has both.
Costs and requirements
| Store | Cost | Notes |
|---|---|---|
| Apple App Store | $99 a year | Needs a Mac with Xcode |
| Google Play | $25 once | New personal accounts must run a closed test with 12 testers for 14 days first |
| Microsoft Store | Free for individuals | For Windows apps |
| Mac or Windows download | Free | Signing a Mac app (notarization) needs the paid Apple account. An unsigned app shows a scary warning |
Find your testers early. Google's rule means you need 12 people for 14 days before you can publish. Apple uses TestFlight to share test builds.
Steps
Claude runs these commands for you inside Claude Code. They are shown so you know what is happening; they do not work if you paste them into a normal terminal.
In Claude Code, run
/shipyard:launchand choose "A phone or desktop app". Claude asks why you want it first, and may suggest the installable web app instead.Add the phone wrapper:
node "${CLAUDE_PLUGIN_ROOT}/scripts/add-shell.mjs" <appDir> mobileIt refuses without a live HTTPS address. It writes a
mobile/folder with the wrapper, an offline page, icons, Apple's privacy file,STORE.md(a draft of your store listing) and aREADME.mdwith the exact next commands. The app id must look likecom.example.myapp. You choose it once, and it cannot change after you publish.Or add the desktop wrapper:
node "${CLAUDE_PLUGIN_ROOT}/scripts/add-shell.mjs" <appDir> desktopIt writes a
desktop/folder and a workflow that builds installers when you push a tag nameddesktop-v1.0.0(or anydesktop-v*).Run the store check:
node "${CLAUDE_PLUGIN_ROOT}/scripts/store-check.mjs" <appDir>It checks the app id, the address, icons, the privacy file, permission texts, account deletion, your listing text and the public pages. Fix every failure.
Build and submit. Claude does not run
npx cap add ios,npx cap add androidor open Xcode or Android Studio without asking, because they need those tools installed. If you want to go on, follow theREADME.mdinmobile/together with Claude, who explains each command.Create your store accounts and pay the fees yourself, recruit your testers, and submit.
Payments inside store apps
Apple requires its own in-app purchase for digital subscriptions sold inside an iOS app, in most regions. Do not put Stripe buttons for digital goods in the iOS app without checking the rules for your region. Android has its own rules, so read Google Play's current payments policy. Selling through your website is separate.
Apple may say no
Apple rejects apps that are only a website inside a frame (guideline 4.2). Before you submit, make sure the app has:
- a native tab bar, or a native feature in the main flow
- a designed offline screen
- no external payment links for digital goods
- a demo login for the reviewers, in the listing notes
Even with all of that, Apple can still reject it. Nothing here is a promise of approval.
Done when
- You decided whether you need a store app at all.
store-check.mjshas no failures.- If you are going ahead: your store accounts exist, your testers are lined up, and a first test build runs on a real device.
If something goes wrong
add-shell.mjsrefuses. Your app is not live on a stable HTTPS address yet. Deploy first.- The store check fails on account deletion or a public page. Both are required by the stores. The template has them, so an old app may need the upgrade in module 2.
- You cannot get 12 testers. Google's rule is firm for new personal accounts. Start asking friends now, or stay with the installable web app.
- Apple rejects it as "just a website". Add a real native feature to the main flow, polish the offline screen, and resubmit with a demo login.