Skip to content

Commit c45033a

Browse files
committed
Update docs
1 parent 2abc320 commit c45033a

13 files changed

Lines changed: 198 additions & 184 deletions

File tree

astro.config.mjs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,12 +140,14 @@ export default defineConfig({
140140
label: 'Creator Guide',
141141
items: [
142142
{ label: 'Welcome', link: '/docs/' },
143+
{ label: 'Philosophy', link: '/docs/philosophy/' },
143144
{ label: 'Inclusion Criteria', link: '/docs/inclusion-criteria/' },
144145
{ label: 'Building Your App', link: '/docs/building/' },
145146
{ label: 'Submitting Your App', link: '/docs/submitting/' },
146147
{ label: 'Deployment & Distribution', link: '/docs/deploying/' },
147148
{ label: 'Maintaining Your App', link: '/docs/maintenance/' },
148-
{ label: 'FAQ & Glossary', link: '/docs/faq/' },
149+
{ label: 'FAQ', link: '/docs/faq/' },
150+
{ label: 'Glossary', link: '/docs/glossary/' },
149151
],
150152
},
151153
],

src/components/FeatureCard.astro

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,17 @@ interface Props {
33
title: string;
44
icon: string;
55
color: string;
6+
href?: string;
67
}
78
8-
const { title, icon, color } = Astro.props;
9+
const { title, icon, color, href } = Astro.props;
10+
// When an href is supplied the entire card becomes a clickable link; the
11+
// existing .feature-card CSS already sets text-decoration: none and
12+
// color: inherit so anchor styling does not bleed through.
13+
const Tag = href ? 'a' : 'span';
914
---
1015

11-
<span class="feature-card" data-color={color}>
16+
<Tag class="feature-card" data-color={color} href={href}>
1217
<div class="feature-card-header">
1318
<div class="feature-card-icon">
1419
<span class="material-symbols-rounded">{icon}</span>
@@ -18,5 +23,4 @@ const { title, icon, color } = Astro.props;
1823
<div class="feature-card-description">
1924
<slot />
2025
</div>
21-
<!-- <span class="feature-card-link">Learn more <span aria-hidden="true">→</span></span> -->
22-
</span>
26+
</Tag>

src/content/docs/docs/building.md

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,25 @@ Several points are worth noting:
116116
- The Swift sources are shared between platforms. Skip handles transpilation to Kotlin and Jetpack Compose. Where platform-specific code is genuinely required, the `#if SKIP` and `#if !SKIP` directives can be used to branch.
117117
- Fastlane metadata is checked in under `Darwin/fastlane/` and `Android/fastlane/`. The contents of these directories are described in [Submitting Your App](/docs/submitting/). The general-purpose references are the [Fastlane documentation](https://docs.fastlane.tools/) and the [Skip Fastlane deployment guide](https://skip.dev/docs/deployment/#fastlane).
118118

119+
### Bundle identifiers {#bundle-id}
120+
121+
Every App Fair app published through the `appfair/` fork is built with a canonical bundle identifier of `org.appfair.app.<token>`. For the `Faire-Games` token this means the production binary ships with:
122+
123+
- **iOS** `PRODUCT_BUNDLE_IDENTIFIER` = `org.appfair.app.Faire-Games`
124+
- **Android** package name = `org.appfair.app.Faire_Games` (underscores replace dashes, since Java package segments cannot contain hyphens)
125+
126+
The `Skip.env` value in the source repository is the *upstream* bundle identifier, used during local development. It can be set to anything the developer team controls — for example `com.example.fairegames` under the developer's own Apple Developer team — which is what makes it possible to sideload and run the app on a real iOS device using the developer's own signing identity. The `appfair/` fork rewrites this value to the canonical `org.appfair.app.<token>` form before signing the production binary, so the upstream bundle ID never reaches end users through the App Fair.
127+
128+
<aside class="callout callout-caution">
129+
<span class="callout-icon" style="--icon: url('/assets/icons/callout/warning.svg');" aria-hidden="true"></span>
130+
<div class="callout-body">
131+
<p class="callout-title">Leaving the App Fair changes the bundle identifier</p>
132+
<p>Bundle identifiers are how Apple and Google decide which installed app a binary updates. An app signed with one bundle ID and an app signed with another are, from the operating system's perspective, two unrelated applications.</p>
133+
<p>If a maintainer leaves the App Fair and resumes publishing the app independently under their own developer accounts, the self-published binary will use the developer's chosen bundle ID rather than <code>org.appfair.app.&lt;token&gt;</code>. Existing users who installed the app from the App Fair catalog would not receive the self-published version as an update; they would have to install it as a separate application, and the new installation would have no access to any data the prior installation stored (preferences, sync state, locally cached content, and so on). Users would effectively start fresh.</p>
134+
<p>This is a one-way consequence of the publisher-of-record arrangement: the App Fair Project owns the <code>org.appfair.app.*</code> namespace, so a departing maintainer cannot take the catalog bundle ID with them.</p>
135+
</div>
136+
</aside>
137+
119138
## Development workflow {#dev-loop}
120139

121140
Day-to-day development follows a standard SwiftUI workflow:
@@ -130,7 +149,7 @@ The full development reference, including parity testing, FFI, and Kotlin intero
130149

131150
## Designing for the Four Cornerstones {#cornerstones-in-practice}
132151

133-
The [four cornerstones](/docs/inclusion-criteria/#four-cornerstones) (transparent, ubiquitous, global, and accessible) are practical engineering constraints. Each is significantly easier to satisfy when designed for from the first commit than when retrofitted later. The remainder of this section translates each cornerstone into specific implementation guidance. (Transparent is handled by the project's licence and dependency choices, covered separately under [Licensing](/docs/inclusion-criteria/#licensing), so the rest of this section focuses on Ubiquitous, Global, and Accessible.)
152+
The [four cornerstones](/docs/philosophy/#four-cornerstones) (transparent, ubiquitous, global, and accessible) are practical engineering constraints. Each is significantly easier to satisfy when designed for from the first commit than when retrofitted later. The remainder of this section translates each cornerstone into specific implementation guidance. (Transparent is handled by the project's licence and dependency choices, covered separately under [Licensing](/docs/inclusion-criteria/#licensing), so the rest of this section focuses on Ubiquitous, Global, and Accessible.)
134153

135154
### Localization (Global) {#l10n}
136155

@@ -202,7 +221,7 @@ Avoid background work the user has not requested. Avoid polling. Avoid burning C
202221

203222
### The AppFairUI components {#appfair-ui}
204223

205-
Every App Fair app depends on the [`appfair-app`](https://github.com/appfair/appfair-app) package, which exposes the `AppFairUI` module. The dependency is added automatically by `skip create --appfair` and is mandatory for every catalog app (see [Technical requirements](/docs/inclusion-criteria/#technical-requirements)).
224+
Every App Fair app depends on the [`appfair-app`](https://github.com/appfair/appfair-app) package, which exposes the `AppFairUI` module. The dependency is added automatically by `skip create --appfair` and is mandatory for every catalog app.
206225

207226
The package supplies the shared About screen, attribution metadata, third-party license rows, the "Made with Skip / Distributed through the App Fair" credits, and the `AppFairSettings` wrapper described below.
208227

src/content/docs/docs/deploying.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: Deployment & Distribution
3-
description: How the App Fair fork builds, signs, and distributes the application.
3+
description: How the `appfair/` fork builds, signs, and distributes the application.
44
---
55

66
After a fork has been created at `github.com/appfair/<app-token>`, the application is connected to the App Fair distribution pipeline. This section describes how the pipeline operates: from the release tag through the signed binary, the app stores, and the [appfair.net](https://appfair.net) catalog.
@@ -10,7 +10,7 @@ After a fork has been created at `github.com/appfair/<app-token>`, the applicati
1010
Each App Fair app is associated with two repositories, both addressed by the app's [token](/docs/inclusion-criteria/#naming):
1111

1212
- The **source repository** in the developer's GitHub organization, e.g. [`github.com/Faire-Games/Faire-Games`](https://github.com/Faire-Games/Faire-Games) for the `Faire-Games` token (published under the displayed title "Fair Games"). The developer owns this repository: source code, issue tracker, and project direction.
13-
- The **App Fair fork** in the [`appfair`](https://github.com/appfair) organization, e.g. [`github.com/appfair/Faire-Games`](https://github.com/appfair/Faire-Games). The App Fair owns this repository, which holds the signing credentials, store API keys, and the published release pipeline.
13+
- The **`appfair/` fork** in the [`appfair`](https://github.com/appfair) GitHub organization, e.g. [`github.com/appfair/Faire-Games`](https://github.com/appfair/Faire-Games). The App Fair owns this repository, which holds the signing credentials, store API keys, and the published release pipeline.
1414

1515
This separation has two effects. The developer retains full control of the source code, including the option to discontinue the App Fair relationship and continue independently. The App Fair handles the account-bound and certificate-bound parts of mobile app distribution.
1616

@@ -66,7 +66,7 @@ When a release tag (for example, `1.0.0`) is synchronized from the source reposi
6666
2. Builds the Android target with `skip export` and signs it with the App Fair keystore.
6767
3. Reads the Fastlane metadata from `Darwin/fastlane/` and `Android/fastlane/` and uploads it alongside the signed binaries to App Store Connect and the Play Console.
6868
4. Submits the build for review.
69-
5. Generates an `appindex.json` describing the release and publishes it (together with the signed binaries) as assets on the corresponding GitHub Release in the App Fair fork. The source repository is not modified by this step.
69+
5. Generates an `appindex.json` describing the release and publishes it (together with the signed binaries) as assets on the corresponding GitHub Release in the `appfair/` fork. The source repository is not modified by this step.
7070

7171
Store review timing is outside the App Fair's control. Apple and Google operate their own review queues, but updates typically appear within a few days. The progress of each step can be observed in real time on the Actions tab of the fork.
7272

@@ -76,7 +76,7 @@ After a release has been signed, submitted, and approved, users can install the
7676

7777
### The Apple App Store {#channel-app-store}
7878

79-
The Apple App Store is the dominant channel for iPhone and iPad. App Fair releases appear there under the App Fair Project's developer name. Within the European Union, [alternative distribution channels for iOS](https://appfair.org/marketplace/) are also planned.
79+
The Apple App Store is the dominant channel for iPhone and iPad. App Fair releases appear there under the App Fair Project's developer name.
8080

8181
### The Google Play Store {#channel-play-store}
8282

@@ -96,7 +96,7 @@ App Fair apps are built by their developers, but the App Fair Project appears pr
9696

9797
This branding requirement allows users to discover the rest of the catalog from any one App Fair app.
9898

99-
## Working Example {#example}
99+
## Working example {#example}
100100

101101
The app with the [`Faire-Games`](https://github.com/Faire-Games/Faire-Games) token (published under the title "Fair Games") demonstrates the full pipeline:
102102

0 commit comments

Comments
 (0)