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.

  1. In Claude Code, run /shipyard:launch and choose "A phone or desktop app". Claude asks why you want it first, and may suggest the installable web app instead.

  2. Add the phone wrapper:

    node "${CLAUDE_PLUGIN_ROOT}/scripts/add-shell.mjs" <appDir> mobile
    

    It 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 a README.md with the exact next commands. The app id must look like com.example.myapp. You choose it once, and it cannot change after you publish.

  3. Or add the desktop wrapper:

    node "${CLAUDE_PLUGIN_ROOT}/scripts/add-shell.mjs" <appDir> desktop
    

    It writes a desktop/ folder and a workflow that builds installers when you push a tag named desktop-v1.0.0 (or any desktop-v*).

  4. 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.

  5. Build and submit. Claude does not run npx cap add ios, npx cap add android or open Xcode or Android Studio without asking, because they need those tools installed. If you want to go on, follow the README.md in mobile/ together with Claude, who explains each command.

  6. 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.mjs has 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.mjs refuses. 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.

Check yourself

What is the cheapest way to get your app onto a phone's home screen? The installable web app (PWA) that every Shipyard app already is. It is free and needs no store review.
Why can't you change the app id after publishing? It is the app's permanent name in the stores. You choose it once.
Can you sell a digital subscription with a Stripe button inside your iOS app? In most regions Apple requires its own in-app purchase for that. Check the current rules for your region first.