<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Антон Темербеков</title>
    <description>The latest articles on DEV Community by Антон Темербеков (@temer).</description>
    <link>https://dev.to/temer</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4066436%2F5bec8e1d-c49b-4aba-b030-953c5a23b229.jpg</url>
      <title>DEV Community: Антон Темербеков</title>
      <link>https://dev.to/temer</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/temer"/>
    <language>en</language>
    <item>
      <title>How we distribute an iOS app outside the App Store: a practical AltStore PAL walkthrough</title>
      <dc:creator>Антон Темербеков</dc:creator>
      <pubDate>Thu, 06 Aug 2026 19:52:07 +0000</pubDate>
      <link>https://dev.to/temer/how-we-distribute-an-ios-app-outside-the-app-store-a-practical-altstore-pal-walkthrough-33li</link>
      <guid>https://dev.to/temer/how-we-distribute-an-ios-app-outside-the-app-store-a-practical-altstore-pal-walkthrough-33li</guid>
      <description>&lt;p&gt;App Store review rejected our app under Guideline 1.2 — the core mechanic (users rate each other's photos) is banned as a category, and no metadata change fixes that. So we became one of the first apps distributed exclusively through an alternative marketplace under the EU's DMA. Documentation for this path is thin and sometimes contradictory, so here is a step-by-step of what actually had to be done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1. Alternative Terms Addendum
&lt;/h2&gt;

&lt;p&gt;You sign an addendum to the developer agreement in App Store Connect. You don't need to be an EU resident. Distribution is free up to 1M first annual installs (companies under €10M revenue get the Core Technology Fee exemption).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2. Registering with the marketplace
&lt;/h2&gt;

&lt;p&gt;AltStore has a REST API to register your developer ID — important: it's the UUID from your ASC profile, &lt;strong&gt;not&lt;/strong&gt; the Team ID (registering with the Team ID silently fails — we stepped on that). The token goes into ASC: Users and Access → Integrations → Marketplaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3. Notarization instead of review
&lt;/h2&gt;

&lt;p&gt;You build and upload with the usual xcodebuild + upload. Then, instead of "Submit for Review", you send it for notarization: an automated security/functionality check, without content guidelines. Ours passed on the first try in ~30 hours. A mechanic banned on the App Store passes here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4. Hosting the ADP yourself
&lt;/h2&gt;

&lt;p&gt;After notarization you download the Alternative Distribution Package: &lt;code&gt;manifest.json&lt;/code&gt;, a &lt;code&gt;signature&lt;/code&gt; file (no extension!), and several &lt;code&gt;.ipa&lt;/code&gt; variants. You host it as-is; hierarchy and hashes must not change. Two gotchas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the extensionless &lt;code&gt;signature&lt;/code&gt; file — our SPA fallback on ASP.NET served index.html instead; fixed with ServeUnknownFileTypes on the static handler;&lt;/li&gt;
&lt;li&gt;the &lt;code&gt;.ipa&lt;/code&gt; must be served as &lt;code&gt;application/octet-stream&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 5. Source JSON and federation
&lt;/h2&gt;

&lt;p&gt;Next to it you put a &lt;code&gt;source.json&lt;/code&gt;: marketplaceID (= the app's Apple ID), the manifest downloadURL, size, icon, screenshots, versions. Users add the source via an &lt;code&gt;altstore://source?url=…&lt;/code&gt; link. Enable federation (a &lt;code&gt;fediUsername&lt;/code&gt; field) and the app becomes searchable right inside the marketplace, no manual source add.&lt;/p&gt;

&lt;h2&gt;
  
  
  Updates
&lt;/h2&gt;

&lt;p&gt;Each new version is the same loop: build → notarize → new ADP on the server → new entry in &lt;code&gt;versions[]&lt;/code&gt; of source.json. AltStore picks up auto-updates itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits and fallbacks
&lt;/h2&gt;

&lt;p&gt;Marketplaces work in the EU, Japan and Brazil, iOS 17.4+. For the rest of the world we run a PWA (standalone manifest + a minimal service worker — Safari installs it to the home screen) and a sideload IPA via AltStore Classic with our own source. The biggest non-technical problem is conversion: you have to explain to users what a marketplace even is, so we funnel all traffic to a single install page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaways
&lt;/h2&gt;

&lt;p&gt;Cost beyond the developer account: zero. Actual time spent: about a week, most of it on the undocumented details above. If the App Store is closed to your app (or you just don't want to hand over 15–30%), this path works today.&lt;/p&gt;

&lt;p&gt;The app from this case study is Rate Me (rateme.lv/ios) — happy to answer questions in the comments.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>apple</category>
      <category>webdev</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
