#103

Ship Mac and iOS apps without opening Xcode, and a no-signup planner hit 600 plans

Xcode never opens: one release.sh signs, notarizes and installs a Mac app headless. Apple's built-in speech API hit 2.12% word error rate, beating Whisper Small.

Listen to this edition

Scott Willsey ships Mac and iOS apps this week without ever opening the one app everyone assumes you need. Xcode has to be installed, but it stays shut, because its build tools all answer from a plain shell. One release.sh then archives, signs, notarizes and installs a build in a single command.

None of this is a workaround. Apple’s own Technical Note TN2339 documents the same command-line archive and export flow. Willsey pegs the one-time setup at an hour or two.

In today’s indie hacker news:

  • 🚀 Ship Mac and iOS apps without opening Xcode
  • 📐 A no-signup floor planner hit 600 plans in two weeks
  • 🎓 Startup, big tech, or a PhD: what the data says
  • 🎧 Apple’s built-in speech API beats Whisper on accuracy
  • 🏰 The only moat AI cannot clone is credibility

Top Stories

NEVER OPEN XCODE AGAIN

🚀 Ship Mac and iOS apps without ever opening Xcode

A closed laptop with a live terminal window glowing above it

The story: Willsey lays out the whole headless setup on his blog. Xcode.app only has to exist on disk, since xcodebuild, notarytool, stapler and devicectl all run fine from a non-interactive terminal. A single script, scripts/release.sh, chains the full release: archive, Developer ID signing, notarization, staple, then a copy into Applications. It fails loudly the moment any step breaks. An AI coding agent drives that script end to end. The only step that stays interactive is a one-time notarytool credential prompt.

The details:

  • Installed, not open: xcode-select must point at the full Xcode.app, since the standalone Command Line Tools lack the iOS SDK and notarytool.
  • Fail-fast by design: the script stops hard the instant any step errors, so a broken build never ships silently.
  • Keys stay out of the repo: the Developer ID private key lives in the login keychain, and xcodebuild finds it through automatic signing.
  • XcodeGen owns the project: one project.yml holds every setting and regenerates the .xcodeproj each build, so git tracks the YAML, not the folder.
  • iPhone, no cable ceremony: iOS skips notarization, and xcrun devicectl lists paired devices by UDID and installs the signed build.

Why builders care: wire it up once and an agent owns the whole build-and-ship loop while you stay on the product. The same release.sh copies into every future app, so the setup cost is paid once and reused forever.

600 PLANS, 102 BELIEVERS

📐 A no-signup floor planner grew to 600 plans on Reddit alone

An apartment floor plan glowing on a bright desk, faint sketches fanning behind it

The story: A solo maker built spaceplanner.co, a free 2D and 3D floor planner with no account and no paywall. In two weeks it drew 600-plus plans, almost all from a couple of Reddit posts, on no ad budget. Only 102 visitors created an account, and the maker says most did it to save across devices or to export. He asked r/SideProject how to grow it without bolting on a wall, and the best replies reframed his own numbers.

The details:

  • Retention is the wrong scoreboard: for a free utility, judge it on qualified inbound like signups and feature requests, not return visits.
  • Those 102 point at export: one commenter read the signups as users flagging where a plan stops being a doodle. Ask for the account at export, not in the nav.
  • Search beats a spike: communities won the first 600, but long-tail search plus answer engines like Bing keep it growing after you stop posting.
  • A ceiling worth knowing: JDoodle grew the same organic way to 1.2 million registered users on almost no marketing, serving over 20 million people.

Why builders care: a free tool with no wall can still win, if you measure the right thing and grow where traffic compounds. The signed-in few are your real base, and search plus answer-engine pages outlast any launch-day spike.

PICK BIG TECH, BET THE STARTUP

🎓 Startup, big tech, or a PhD: the data leans one way

A lone figure at a three-way fork in a foggy road at dawn

The story: A robotics engineer asked r/startups whether to hop startups, chase a PhD, or climb big tech. It is the fork a 2020 Ask HN thread argued over, and five years of answers point the same way. Named practitioners treat big tech as the low-variance default and spend the startup bet narrowly. A Meta staff engineer, Ryan Peterman, tells new grads to start there for their first one to three years.

The details:

  • The pay gap is real: entry-level big-tech comp runs 180,000 to 220,000 dollars against about 130,000 at a startup, per Levels.fyi for New York.
  • PhD founders are thinning: HEC Paris found the share of US science and engineering PhDs joining a new firm down about 38% since 1997.
  • Incumbents move slowly: Nikita Bier, who sold tbh to Facebook, says big companies take 12 to 24 months to answer a competitive threat.
  • The upside is narrow: the same founder says post-IPO proceeds, after several dilution rounds, can match 90 days of his app work.

Why builders care: use big tech as early cover, a paycheck and a resume stamp, not as a ceiling. Keep the PhD only if you love research, and spend the startup bet on an edge incumbents cannot defend fast.

THE 460MB MODEL JUST LOST

🎧 Apple’s built-in speech API beat Whisper Small on accuracy

Two audio waveforms racing, a small chip pulling ahead of a bulky crate

The story: Apple shipped SpeechAnalyzer, a new on-device speech-to-text API, in iOS 26 and macOS 26. An Inscribe benchmark ranked it first of five on-device engines, at a 2.12% word error rate on clean speech. The roughly 460MB Whisper Small that many apps bundle came in at 3.74%, while SpeechAnalyzer ran about three times faster. Inscribe sells an app bundling these engines and says so, which is the right reason to check its raw transcripts.

The details:

  • The old API lost badly: Apple’s legacy SFSpeechRecognizer scored 9.02% on the same clean speech, roughly 3.5 to 4 times worse than the new one.
  • Free and nothing to bundle: the model downloads on first use, runs outside your app’s memory, and adds nothing to your download size.
  • The catch is languages: Argmax lists 10 supported languages against Whisper’s 100, so anything multilingual still needs Whisper.
  • A feature went missing: the new API dropped Custom Vocabulary, so keyword-heavy apps that lean on names stay on the old path for now.

Why builders care: if you ship English transcription on Apple platforms, the build-versus-bundle math flipped toward the system API. Anything on the old recognizer should move, and English-only apps that can require iOS 26 can drop bundled Whisper.

THEY CAN’T CLONE YOUR RECEIPTS

🏰 When AI clones features in days, credibility is the only moat

A row of near-identical app windows, one older one glowing with earned age

The story: A post titled I know it’s discouraging hit a nerve on r/SideProject this week. Its argument is simple. When AI can clone a Cursor or a Granola in days, features stop being a moat. The scarce asset is the credibility you build in public. The author’s bar for founders is blunt, that you should expect months of building with no paid user. One commenter pushed back that nobody ships a real Cursor clone in a few days. The author narrowed the claim to shipping in public, not clone quality.

The details:

  • Plan for the quiet months: treat a long stretch with zero paid users as the normal path, not proof you failed.
  • Discount the highlight reel: one commenter called the fake million-in-a-month posts survivorship bias, since most products look dead before they slowly get less dead.
  • Distribution, not code: another put it plainly, that the internet now holds 400 clones of the same app with different gradients.
  • The canon agrees: Paul Graham calls determination the top predictor of startup success, and the survivorship reading is that most builders fail unseen.

Why builders care: with the same AI toolbox in every hand, the one thing a rival cannot copy is earned trust. Show the work and keep shipping through the flat months, because that record is the part a competitor cannot download.

Drama

ZERO DOLLARS, ONE ANGRY SUPERPOWER

🎮 A $0 satire game pulled a state-backed campaign onto its maker

The story: A developer built Xiablo, a multiplayer web game that mocks the Chinese Communist Party and Xi Jinping, purely for fun. It has earned exactly zero dollars. In return, he says a state-backed campaign came after him. It weaponized ICANN’s UDRP, the domain-dispute process meant for trademark squatters, and reached as far as his home. The revenue was nothing. The response, by his account, ran to hundreds of thousands of dollars.

Why builders care: a side project can cost you nothing to run and still carry real-world risk when it touches power. Know that a domain and a home address are attack surface before you ship something political.

Stack of the Day

THE COMMAND HIDING IN PLAIN SIGHT

🔧 git log, the history tool you already have

A developer argues that git’s history commands deserve far more attention than they get. Most of us learned three flags and stopped, though the log is the cheapest way to read an unfamiliar codebase. It is free, ships with every repo, and rewards the ten minutes most of us never spent past the basics.

Not sponsored. We just feature tools builders would actually use.

Bookmarked Today

Ship something today, even if you are the only one who ever sees it.

Curated by AI, built by a human.