Skip to content

Commit 009ff0c

Browse files
committed
Update documentation
1 parent cfe47f7 commit 009ff0c

File tree

1 file changed

+83
-21
lines changed

1 file changed

+83
-21
lines changed

src/content/docs/docs/index.md

Lines changed: 83 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -131,79 +131,141 @@ Apps should work in a variety of network conditions: fast wi-fi as well as slow
131131

132132
#### Be fast to launch and efficient with memory and battery {#guideline-fast}
133133

134-
_writing in progress…_
134+
App Fair apps should launch quickly and be mindful of the device's resources. Avoid unnecessary background processing, large memory allocations, and operations that drain the battery. Users on older devices and slower connections should still have a good experience.
135135

136136
#### Provide in-app guidance {#guideline-guidance}
137137

138-
_writing in progress…_
138+
Apps should be intuitive to use without requiring external documentation. Include onboarding screens or contextual hints where appropriate, so that users of all experience levels can understand the app's functionality without searching for help.
139139

140140
#### Facilitate easy translation {#guideline-translations}
141141

142-
_writing in progress…_
142+
All user-facing strings should be externalized using the platform's standard localization mechanisms. In SwiftUI, this means using `LocalizedStringKey` and `.strings`/`.xcstrings` files. Skip automatically bridges these to Android's string resource system. Avoid hardcoded strings in your views so that community translators can contribute localizations without modifying code.
143143

144144
### The app development cycle {#appdev}
145145

146-
_writing in progress…_
146+
The day-to-day development workflow for an App Fair app follows standard Xcode practices:
147+
148+
1. **Open your project in Xcode** and develop using Swift and SwiftUI as you normally would. Skip's Xcode plugin automatically generates the corresponding Android project in the background.
149+
2. **Test on iOS** using the iOS Simulator directly from Xcode.
150+
3. **Test on Android** by running the Android target from Xcode, which launches the Android emulator via Gradle. You can also open the generated Android project in Android Studio for platform-specific debugging.
151+
4. **Commit and push** your changes to your repository. Each push triggers the CI workflow, which builds both the iOS and Android targets to verify that your app compiles correctly on both platforms.
152+
5. **Iterate** on your app by repeating the above steps. Use Pull Requests for larger changes to take advantage of CI build verification before merging.
153+
154+
For more details on Skip's development workflow, see the [Skip documentation](https://skip.tools/docs/).
147155

148156
## Releasing {#releasing}
149157

150-
_writing in progress…_
158+
The App Fair release process is designed so that you, the creator, maintain full ownership of your source code in your own GitHub organization, while the App Fair handles the building, signing, and distribution of your app to the Apple App Store and Google Play Store.
159+
160+
The process works through a fork-based model:
161+
162+
1. You develop and tag releases in your own repository (e.g., `github.com/Tune-Out/Tune-Out`).
163+
2. The App Fair maintains a fork of your repository (e.g., `github.com/appfair/Tune-Out`).
164+
3. When release tags are synchronized to the App Fair fork, GitHub Actions workflows automatically build, sign, and deploy your app to the distribution channels.
165+
166+
This separation ensures that you always retain control of your source code while the App Fair manages the signing credentials and store submission process.
151167

152168
### About the App Fair release process {#app-fair-releases}
153169

154-
_writing in progress…_
170+
The release pipeline is powered by GitHub Actions and the [skiptools/actions](https://github.com/skiptools/actions) reusable workflows. Every App Fair app repository includes a CI workflow file (e.g., `.github/workflows/app-name.yml`) that was created during `skip init --appfair`. This workflow is configured to:
171+
172+
- **Build on every push to `main`** — ensures the app compiles on both platforms after every commit.
173+
- **Build on Pull Requests** — validates changes before they are merged.
174+
- **Build and release on version tags** — when a tag matching the pattern `X.Y.Z` (e.g., `1.1.6`) is pushed, the workflow builds release binaries for both iOS and Android.
175+
- **Run daily scheduled builds** — catches issues caused by upstream dependency changes.
155176

156-
<!-- When it is time to release your app and submit it to the various distribution channels, -->
177+
The workflow calls the shared `skiptools/actions` build pipeline, which handles compiling the Swift/SwiftUI code for iOS and transpiling it to Kotlin/Jetpack Compose for Android via Skip. When the appropriate signing credentials are configured (in the App Fair fork), the workflow also handles code signing and submission to the Apple App Store and Google Play Store.
178+
179+
**Example:** The [Tune-Out](https://github.com/Tune-Out/Tune-Out) app uses this exact process. Its CI workflow triggers on every push and on version tags. The App Fair fork at [appfair/Tune-Out](https://github.com/appfair/Tune-Out) has the signing secrets configured, so when a release tag is synchronized to the fork, the app is automatically built, signed, and submitted to both stores.
157180

158181
### Managing metadata {#metadata}
159182

160-
_writing in progress…_
183+
App store metadata — including your app's description, keywords, screenshots, and promotional text — is managed through [Fastlane](https://fastlane.tools/) metadata files that live in your repository. This keeps all of your app's metadata version-controlled alongside the code, and allows the automated release pipeline to submit metadata updates to the stores.
161184

162185
#### About Fastlane {#metadata-fastlane}
163186

164-
_writing in progress…_
187+
Fastlane is an open-source tool for automating mobile app deployment. The App Fair uses Fastlane's metadata directory structure to organize app store listings for both iOS and Android. When you initialize your app with `skip init --appfair`, a Fastlane metadata directory structure is created in your repository.
165188

166189
#### Android metadata {#metadata-fastlane-android}
167190

168-
_writing in progress…_
191+
Android metadata is stored under `fastlane/metadata/android/` in your repository. This includes directories for each locale (e.g., `en-US/`, `fr-FR/`) containing files such as:
192+
193+
- `title.txt` — The app's display name on the Play Store.
194+
- `short_description.txt` — A brief summary (up to 80 characters).
195+
- `full_description.txt` — The full Play Store description (up to 4000 characters).
169196

170197
##### Android screenshots {#metadata-fastlane-android-screenshots}
171198

172-
_writing in progress…_
199+
Android screenshots are placed in the locale directories under `images/` subdirectories (e.g., `phoneScreenshots/`, `tabletScreenshots/`). Include screenshots that showcase your app's key features. Google Play requires at least two screenshots per device type.
173200

174201
#### iOS metadata {#metadata-fastlane-ios}
175202

176-
_writing in progress…_
203+
iOS metadata is stored under `fastlane/metadata/` and follows a similar per-locale directory structure. Key files include:
204+
205+
- `name.txt` — The app's display name on the App Store.
206+
- `subtitle.txt` — A brief subtitle (up to 30 characters).
207+
- `description.txt` — The full App Store description.
208+
- `keywords.txt` — Comma-separated keywords for App Store search.
209+
- `promotional_text.txt` — Text that can be updated without a new app version.
177210

178211
##### iOS screenshots {#metadata-fastlane-ios-screenshots}
179212

180-
_writing in progress…_
213+
iOS screenshots are placed under `screenshots/` in locale subdirectories. Apple requires screenshots for various device sizes (e.g., iPhone 6.7", iPhone 6.5", iPad 12.9"). Screenshots should highlight your app's primary functionality and be provided for each supported device class.
181214

182215
### Creating a tag {#release-tag}
183216

184-
_writing in progress…_
217+
When your app is ready for release, you create a release by tagging your repository with a [semantic version](https://semver.org/) number. The tag must match the pattern `X.Y.Z` (e.g., `1.0.0`, `1.1.6`):
218+
219+
```
220+
git tag 1.0.0
221+
git push origin 1.0.0
222+
```
223+
224+
This tag push triggers the CI workflow in your repository, which will build unsigned binaries for both iOS and Android and attach them to a GitHub Release. These unsigned builds serve as verification that your app compiles correctly.
225+
226+
The version number in the tag must also match the version configured in your Xcode project. Follow semantic versioning conventions: increment the major version for breaking changes, the minor version for new features, and the patch version for bug fixes.
185227

186228
### Fork requests {#fork-request}
187229

188-
_writing in progress…_
230+
Once your app is ready for distribution through the App Fair, you need to request that the App Fair create a fork of your repository. This is done by submitting a fork request on the [App Fair discussion forums](https://github.com/orgs/appfair/discussions).
231+
232+
The App Fair team will review your app to ensure it meets the project's guidelines (open source, no tracking/advertising, generally useful), and if approved, will create a fork under the `appfair` GitHub organization (e.g., `github.com/appfair/App-Name`).
233+
234+
The App Fair fork is where the signing and deployment magic happens. The fork contains the same CI workflow as your source repository, but with additional secrets configured:
235+
236+
- **Android signing:** `KEYSTORE_JKS`, `KEYSTORE_PROPERTIES`, and `GOOGLE_PLAY_APIKEY` for signing and publishing to the Google Play Store.
237+
- **iOS signing:** `APPLE_CERTIFICATES_P12`, `APPLE_CERTIFICATES_P12_PASSWORD`, and `APPLE_APPSTORE_APIKEY` for signing and publishing to the Apple App Store.
189238

190-
<!-- A.F.F.R. -->
239+
These secrets are managed by the App Fair and are never exposed to the app creator. This means the App Fair handles the entire signing and submission process on your behalf.
240+
241+
**Example:** The [Tune-Out](https://github.com/Tune-Out/Tune-Out) app is maintained by its creators in the `Tune-Out` organization. The App Fair fork at [appfair/Tune-Out](https://github.com/appfair/Tune-Out) is where release tags trigger the signed builds that are submitted to the Apple App Store and Google Play Store.
191242

192243
### Handling feedback {#handling-feedback}
193244

194-
_writing in progress…_
245+
After your app is published, users may report issues or request features. GitHub Issues on your source repository is the primary channel for this feedback. You should monitor your repository's issues and respond to user reports in a timely manner.
246+
247+
For issues reported through the app stores (App Store reviews, Play Store reviews), you can respond through the respective store's developer console. However, encouraging users to file GitHub Issues for bug reports ensures that feedback is tracked alongside your development workflow.
195248

196249
## Maintenance {#app-maintenance}
197250

198-
_writing in progress…_
251+
Maintaining an App Fair app is an ongoing commitment. Your app should continue to function correctly as operating systems are updated and user expectations evolve. The daily scheduled CI builds help catch issues caused by upstream changes in dependencies or platform SDKs.
199252

200253
### Releasing updates {#app-updates}
201254

202-
_writing in progress…_
255+
The update process follows the same workflow as the initial release:
256+
257+
1. **Develop and test** your changes in your source repository, pushing commits to `main`.
258+
2. **Update the version number** in your Xcode project (incrementing the patch, minor, or major version as appropriate).
259+
3. **Create and push a new tag** (e.g., `git tag 1.1.7 && git push origin 1.1.7`).
260+
4. **Synchronize the tag** to the App Fair fork. The App Fair will sync the new tag from your source repository to the fork, which triggers the automated build and submission pipeline.
261+
262+
The new version will be built, signed, and submitted to the Apple App Store and Google Play Store through the App Fair fork's CI workflow. App store review times vary, but updates typically appear within a few days.
203263

204264
### Managing localization and translations {#app-localization}
205265

206-
_writing in progress…_
266+
App Fair apps should strive to be accessible to users worldwide. If you used `LocalizedStringKey` and standard localization files as recommended, community members can contribute translations by submitting Pull Requests to your repository with new or updated `.strings`/`.xcstrings` files.
267+
268+
You can also update the Fastlane metadata files for each locale to ensure that your app's store listing is translated alongside the app itself.
207269

208270

209271
## FAQ
@@ -258,7 +320,7 @@ You can post a Call for Maintenance (CFM) on the App Fair discussion forums, and
258320

259321
### I am not a developer, but I would like to translate an app into another language. How can I help? {#faq-translators}
260322

261-
_writing in progress…_
323+
You can contribute translations by submitting a Pull Request to an app's GitHub repository with new or updated localization files. Most App Fair apps use standard `.strings` or `.xcstrings` files for user-facing text. Browse the [App Fair repositories](https://github.com/orgs/appfair/repositories) to find an app you'd like to help translate, and check its existing localization files to see which languages are already supported.
262324

263325
### I am not a developer. How else can I help the App Fair Project? {#faq-other-contributions}
264326
The App Fair Project is run solely on donations from users like you. Please consider making a contribution to the ongoing development and hosting fees by going to [appfair.org/donate/](https://appfair.org/donate/).

0 commit comments

Comments
 (0)