diff --git a/DECISIONS.md b/DECISIONS.md
new file mode 100644
index 0000000..3bbae44
--- /dev/null
+++ b/DECISIONS.md
@@ -0,0 +1,31 @@
+# Decisions
+
+This file exists to provide a historical record of the motivation for important technical decisions in the project. It's inspired by Architectural Decision Records, but the implementation is intentionally simpler than usual. When a new decision is made, append it to the end of the file with a header. Decisions can be changed later. This is a reflection of real life, not a contract that has to be followed.
+
+## Why Make Xcodes.app?
+
+[xcodes](https://github.com/RobotsAndPencils/xcodes) has been well-received within and outside of Robots and Pencils as an easy way to manage Xcode versions. A command line tool can have a familiar interface for developers, and is also easier to automate than most GUI apps.
+
+Not everyone wants to use a command line tool though, and there's an opportunity to create an even better developer experience with an app. This is also an opportunity for contributors to get more familiar with SwiftUI and Combine on macOS.
+
+## Code Organization
+
+To begin, we will intentionally not attempt to share code between xcodes and Xcodes.app. In the future, once we have a better idea of the two tools' functionality, we can revisit this decision. An example of code that could be shared are the two AppleAPI libraries which will likely be very similar.
+
+While the intent of xcodes' XcodesKit library was to potentially reuse it in a GUI context, it still makes a lot of assumptions about how the UI works that would prevent that happening immediately. As we reuse that code (by copying and pasting) and tweak it to work in Xcodes.app, we may end up with something that can work in both contexts.
+
+## Asynchrony
+
+Xcodes.app uses Combine to model asynchronous work. This is different than xcodes, which uses PromiseKit because it began prior to Combine's existence. This means that there is a migration of the existing code that has to happen, but the result is easier to use with a SwiftUI app.
+
+## Dependency Injection
+
+xcodes used Point Free's Environment type, and I'm happy with how that turned out. It looks a lot simpler to implement and grow with a codebase, but still allows setting up test double for tests.
+
+- https://www.pointfree.co/episodes/ep16-dependency-injection-made-easy
+- https://www.pointfree.co/episodes/ep18-dependency-injection-made-comfortable
+- https://vimeo.com/291588126
+
+## State Management
+
+While I'm curious and eager to try Point Free's [Composable Architecture](https://github.com/pointfreeco/swift-composable-architecture), I'm going to avoid it at first in favour of a simpler AppState ObservableObject. My motivation for this is to try to have something more familiar to a contributor that was also new to SwiftUI, so that the codebase doesn't have too many new or unfamiliar things. If we run into performance or correctness issues in the future I think TCA should be a candidate to reconsider.
diff --git a/R&PLogo.png b/R&PLogo.png
new file mode 100644
index 0000000..5d9645d
Binary files /dev/null and b/R&PLogo.png differ
diff --git a/README.md b/README.md
index c48fc8f..1c2c1b6 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,27 @@
# Xcodes.app
+The easiest way to install and switch between multiple versions of Xcode.
+
+_If you're looking for a command-line version of Xcodes.app, try `[xcodes](https://github.com/RobotsAndPencils/xcodes).`_
+

-Like xcodes, but app-ier.
+## Installation
+
+Xcodes.app is currently only provided as source code that must be built using Xcode.
+
+## Development
+
+You'll need macOS 11 Big Sur and Xcode 12 in order to build and run Xcodes.app.
+
+Notable design decisions are recorded in [DECISIONS.md](./DECISIONS.md). The Apple authentication flow is described in [Apple.paw](./Apple.paw), which will allow you to play with the API endpoints that are involved using the [Paw](https://paw.cloud) app.
+
+[`xcode-install`](https://github.com/xcpretty/xcode-install) and [fastlane/spaceship](https://github.com/fastlane/fastlane/tree/master/spaceship) both deserve credit for figuring out the hard parts of what makes this possible.
+
+## Contact
+
+
+
+Made with ❤️ by [Robots & Pencils](http://www.robotsandpencils.com)
+
+[Twitter](https://twitter.com/robotsNpencils) | [GitHub](https://github.com/robotsandpencils)
diff --git a/Xcodes.xcodeproj/project.pbxproj b/Xcodes.xcodeproj/project.pbxproj
index c1ba851..f3a3d58 100644
--- a/Xcodes.xcodeproj/project.pbxproj
+++ b/Xcodes.xcodeproj/project.pbxproj
@@ -53,6 +53,10 @@
CAA1CB44255A5B60003FD669 /* SignIn2FAView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignIn2FAView.swift; sourceTree = ""; };
CAA1CB48255A5C97003FD669 /* SignInSMSView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInSMSView.swift; sourceTree = ""; };
CAA1CB4C255A5CFD003FD669 /* SignInPhoneListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignInPhoneListView.swift; sourceTree = ""; };
+ CABFA9A02592EAF500380FEE /* R&PLogo.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "R&PLogo.png"; sourceTree = ""; };
+ CABFA9A12592EAFB00380FEE /* LICENSE */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE; sourceTree = ""; };
+ CABFA9A32592ED5700380FEE /* Apple.paw */ = {isa = PBXFileReference; lastKnownFileType = file; name = Apple.paw; path = ../xcodes/Apple.paw; sourceTree = ""; };
+ CABFA9D42592EF6300380FEE /* DECISIONS.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = DECISIONS.md; sourceTree = ""; };
CAD2E79E2449574E00113D76 /* Xcodes.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Xcodes.app; sourceTree = BUILT_PRODUCTS_DIR; };
CAD2E7A12449574E00113D76 /* XcodesApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XcodesApp.swift; sourceTree = ""; };
CAD2E7A32449574E00113D76 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
@@ -109,6 +113,10 @@
isa = PBXGroup;
children = (
CA8FB5F8256E0F9400469DA5 /* README.md */,
+ CABFA9D42592EF6300380FEE /* DECISIONS.md */,
+ CABFA9A02592EAF500380FEE /* R&PLogo.png */,
+ CABFA9A32592ED5700380FEE /* Apple.paw */,
+ CABFA9A12592EAFB00380FEE /* LICENSE */,
CA8FB61C256E115700469DA5 /* .github */,
CA538A0F255A4F3300E64DD7 /* XcodesKit */,
CA538A0C255A4F1A00E64DD7 /* AppleAPI */,