# Kickstarter's iOS app as an open source Swift codebase

> Kickstarter published the full Swift source of its iOS app, including view models built on ReactiveSwift, snapshot tests and GraphQL code generation. It is a reference for architecture, not a product you can ship as your own app.

**kickstarter/ios-oss** — Kickstarter for iOS. Bring new ideas to life, anywhere.

- Repository: https://github.com/kickstarter/ios-oss
- Website: https://www.kickstarter.com/mobile
- Stars: 8,671 · Forks: 1,231
- Language: Swift
- License: Apache-2.0
- Published: 2026-09-21 · Updated: 2026-09-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/kickstarter-ios-oss

## What kickstarter/ios-oss actually gives you

This is the production iOS client for Kickstarter, published under Apache-2.0. The README is explicit that the intent is educational: it says the team wants to share "our wins, mistakes, and methodology of iOS development as we work in the open," and that the primary focus remains improving the app for Kickstarter's own users. That framing matters when you decide what to do with the code.

The audience is Swift engineers who want to read a real, large app rather than a sample project. The repository ships the app target plus separate Swift packages for KDS (the design system), KsApi (the API layer), Library and Kickstarter-Framework. There is also a GraphAPI directory and an apollo-codegen-config.json, so the GraphQL layer is generated, not hand-written. None of this is a template you rename and publish; it is a working client for one company's backend.

## View models as pure signal mappings

The architectural idea the README highlights most is the view model. Kickstarter writes them as "a pure mapping of input signals to output signals," using ReactiveSwift and its own ReactiveExtensions operators on top of ReactiveCocoa. The goal stated in the README is to isolate side effects and keep a functional core.

In practice that means a view model takes inputs (user actions, API responses) and returns outputs the view controller binds to, with no direct UIKit work inside. The README points to the Library/ViewModels directory and says these are tested heavily, including tests for localization, accessibility and event tracking. That is the part worth copying: the test surface follows the view model, not the view controller, so behaviour that is normally trapped in a UI test becomes a plain unit test.

The trade-off is dependency weight. ReactiveSwift, ReactiveCocoa, Prelude and ReactiveExtensions are all in the tree, and a new contributor has to learn signal semantics before reading any screen. If your team has no reactive background, this is the steepest part of the codebase.

## Snapshot tests as the visual contract

Each feature folder under Kickstarter-Framework contains a __Snapshots__ directory. The README says these together hold nearly 600 screenshots covering languages, devices and edge-case states, and links two examples: a backer viewing a project in Japanese, and a creator viewing a dashboard in German on an iPad. The snapshot library used is Point-Free's SnapshotTesting.

The naming convention is the interesting detail. File names encode the scenario, for example testLoggedIn_Backer_LiveProject_NonUS_ProjectCurrency_US_ProjectCountry_NonUS_UserChosenCurrency_NotOmittingCurrencyCode_Success.lang_ja_device_pad.png. Every dimension that changes rendering (login state, currency, country, language, device) becomes part of the test name. That is a deliberate cost: the names are long and brittle to rename, but a diff tells you exactly which combination changed.

What the README does not document is how snapshots are re-recorded or reviewed, and it does not describe a policy for when a snapshot change is acceptable. That gap is real for anyone adopting the pattern.

## Cloning and running it against mock data

The README gives two setup steps: install Xcode (it names Xcode 14.3 with Swift 5.8) and clone the repository. To run without live credentials, it says to set KsApi.Secrets.isOSS to true, which the README describes as a mock version that serves up hard-coded data immediately. That flag is the fastest way to see the app render.

Because the project uses a Makefile, the build and test entry points are shell commands rather than Xcode-only actions. The Makefile defaults SCHEME to $(TARGET)-$(PLATFORM) with TARGET set to Kickstarter-Framework and PLATFORM to iOS, so the default scheme is Kickstarter-Framework-iOS.

```bash
git clone https://github.com/kickstarter/ios-oss.git
cd ios-oss
make test-all
```

The README states that make test-all runs all tests from the command line, and the Makefile shows it delegating to test-app and then test-modules. The module targets are separate: test-kds, test-ksapi, test-library and test-kickstarter-framework, each running xcodebuild against a package scheme such as KsApi-Package. Expect the simulator destination to matter; the Makefile pins IOS_VERSION to 18.6 and IPHONE_NAME to iPad mini (A17 Pro), and its comment says to keep that simulator in sync with Library/TestHelpers/TestCase.swift and the CircleCI config. If your installed simulators do not include that device and runtime, override the variables rather than editing the Makefile.

## Where this codebase will not help you

The app is wired to Kickstarter's backend. KsApi is the API layer, GraphAPI and graphql/ drive Apollo code generation, and the README lists third-party SDKs including Stripe, Firebase, Appboy (Braze), Facebook and PerimeterX. Those are not optional decorations; they are part of how the shipped app authenticates, charges and tracks. Repointing all of that at your own service is a rewrite of the integration layer, not a configuration change.

There is also no documented path for building a distributable variant. The Makefile has RELEASE ?= itunes and a DIST_BRANCH variable, but the README does not explain a release process, and the truncated Makefile does not show what those targets do. Treat release tooling as unspecified.

Finally, the README does not document rollback, migration or upgrade procedures for the app itself. If you need a maintained SDK or a supported library with a compatibility promise, this repository is the wrong shape: it is an application, versioned as an application, with releases such as 5.37.0 in August 2026.

## How it differs from a UI framework or a starter kit

The closest thing to an alternative is a project like Kickstarter's own Android app, kickstarter/android-oss, which the README links as the sibling open source client. Same product, same backend, different platform and different language, so the two share product decisions rather than code. If you are choosing a reference architecture, the comparison is really about which platform's idioms you want to study.

A different category of alternative is a general-purpose Swift UI or architecture library, which gives you reusable pieces without an app attached. The difference in approach is the direction of the dependency: a library expects you to build the app around it, while ios-oss is a finished app you read. The view model pattern here only makes sense together with ReactiveSwift, so lifting it into a non-reactive codebase means rewriting the inputs and outputs as callbacks or async sequences. The snapshot tests, by contrast, transplant more cleanly, since SnapshotTesting is a third-party package and the naming convention is just a convention.

## Maintenance, licence and upgrade cost

The repository is not archived, and the last push was on 2026-09-21, the same day as the most recent activity. Releases are frequent, with 5.37.0 on 2026-08-26, 5.36.0 on 2026-07-23 and 5.35.1 on 2026-07-21. Those are app releases, so the cadence reflects Kickstarter's product schedule, not a library's compatibility promise. If you fork it, you inherit the cost of tracking Xcode and Swift versions yourself; the README currently names Xcode 14.3 and Swift 5.8, while the Makefile pins simulator runtime 18.6, and those two facts age independently.

The code is Apache-2.0, the standard permissive licence, and the README includes the full licence text plus a pointer to NOTICE.md for third-party notices. Apache-2.0 permits commercial use and modification, but it also carries a notice and attribution requirement, and the bundled SDKs have their own terms that NOTICE.md is meant to capture. This is not legal advice; if you plan to ship a derivative, read NOTICE.md and the individual SDK licences before you rely on the repository's licence alone.

## Conclusion

Adopt kickstarter/ios-oss as a reading and pattern reference if you work in Swift and want to see how a large app separates view models, GraphQL codegen and snapshot tests. Do not adopt it if you need a white-label storefront: the README frames the project as an educational resource, the app talks to Kickstarter's own API, and the repo carries third-party SDKs for Stripe, Firebase, Braze, Facebook and PerimeterX that you would have to remove or replace. Before cloning, check the Xcode and Swift version the README names, and confirm that KsApi.Secrets.isOSS set to true gives you the hard-coded mock data you expect.

## FAQ

### Is iOS built off of Linux?

Nothing in the repository material addresses this. The README only describes kickstarter/ios-oss as Kickstarter's open source iOS app and lists its Xcode and Swift requirements.

### Is macOS just FreeBSD?

The repository material does not discuss macOS internals. It only states that Xcode must be installed, and names Xcode 14.3 with Swift 5.8 as the supported version.

### Is Xcode free to use?

The README lists installing Xcode as the first getting-started step but does not discuss its cost or licensing. Nothing in the repository material addresses that question.

### What does iOS stand for?

The repository material does not give an expansion of the name. The README refers to the iOS app only as Kickstarter's native client, with no explanation of the acronym.

## Sources

- [kickstarter/ios-oss on GitHub](https://github.com/kickstarter/ios-oss)
- [License: Apache-2.0](https://github.com/kickstarter/ios-oss/blob/main/LICENSE)
- [Project website](https://www.kickstarter.com/mobile)
- [README](https://github.com/kickstarter/ios-oss/blob/main/README.md)
- [Releases](https://github.com/kickstarter/ios-oss/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/kickstarter-ios-oss
