{"action":"created","comment":{"url":"https://api.github.com/repos/artsy/artsy.github.com/pulls/comments/29332183","id":29332183,"diff_hunk":"@@ -0,0 +1,63 @@\n+---\n+layout: post\n+title: How we Open Source'd Eigen \n+date: 2015-04-28\n+comments: true\n+categories: [ios, mobile, eigen]\n+author: Orta Therox\n+github-url: https://www.github.com/orta\n+twitter-url: http://twitter.com/orta\n+blog-url: http://orta.io\n+---\n+\n+It was 95 days ago, and I was sitting before of my computer in NYC. I loaded my terminal, opened [TapTalk](https://taptalk.me) on my phone, tapped on my collegue [Ash's](http://ashfurrow.com) face and held my finger there. I paused, this moment was a long time, it was worth waiting. I switched the camera from my face to the screen with the terminal open.\n+\n+This moment was probably the most nervous I had been in years. It showed `git push origin master`. I said \"it's happening.\" I hit return. A new era in the Artsy mobile team had started. A few minutes later, I wrote this tweet:\n+\n+<center>\n+<blockquote class=\"twitter-tweet\" data-cards=\"hidden\" lang=\"en\"><p>We have open source’d the <a href=\"https://twitter.com/artsy\">@Artsy</a> iOS app.&#10;&#10;<a href=\"https://t.co/c1SWtHmUgy\">https://t.co/c1SWtHmUgy</a>&#10;&#10;🎉</p>&mdash; Ørta (@orta) <a href=\"https://twitter.com/orta/status/558395611754819586\">January 22, 2015</a></blockquote>\n+</center>\n+\n+\n+Let's go over the process we went through to get to that point.\n+\n+<!-- more -->\n+\n+Credit where credit is due, when we were [working on Eidolon](/blog/2014/11/13/eidolon-retrospective/), our CTO [dB](http://code.dblock.org/) just casually tossed the idea that, really, Eigen should be open source too. This totally threw me for a loop, we were only just getting to a point where we could build an app from scratch in the open. Trying to get a project that had existed for years and had it's own momentum converted would take a lot of thinking about.\n+\n+We devoted time at the end of 2014 to understand what the constraints were for getting the app opened. From a purely functional perspective we would have to start with a [drastic decision](https://github.com/artsy/mobile/issues/11) around the repo itself. \n+\n+### The Repo\n+\n+We opted to go for a total repo switch, removing all history. There were a lot of places where keys could have been hiding within the app. To get this done we migrated the existing `eigen` to `eigen-private` on github, and did a fresh `git init`. People who have joined Artsy Mobile post-OSS have never even cloned the `eigen-private` repo. So I feel good about this call.\n+\n+We used the last few moments of the private repo to remove all of the default Apple copyright notices. We didn't feel they added anything on top of the git history, and make it feel like the founders of a project are more important than anyone working on improvements.\n+\n+It wasn't all smooth sailing with respect to the repo switch however. As the switch happened the WatchKit came out, and we had devoted quite a lot of time to building an app in it. Given that you [can't predict Apple](http://www.elischiff.com/blog/2015/3/24/fear-of-apple)'s reactions, we opted to work on a branch from our private repo. [For months](https://github.com/artsy/eigen/pull/302). In the end it was easier to have the two folders next to each other, then copy & paste over all the files and to set all the settings in the Xcproject again.\n+\n+### Docs\n+\n+We had to significantly update our README, and a lot of the process around bootstrapping. We wanted to reduce the friction to actually trying the app as much as possible. It's easy to look at the source on github but to be able to get it up and running quickly should be a really high priority. So our README is based on getting it up and running as an OSS project, not for someone internal who may push betas/releases. \n+\n+When we opened the repo, there was a lot of documentation fix PRs. They're low barriers to entry, and fun to make for people on big projects. We still get them pretty regularly.\n+\n+### Secrets\n+\n+There isn't large sections of the our app that we are keeping secret. Though we have discussed ways in which we could. There is however a nice solution to having something different for OSS vs your internal team, API compatible CocoaPods. We [do this](/blog/2014/06/20/artsys-first-closed-source-pod/) for our fonts in all apps. We've talked extensively about our [tools for keeping](/blog/2015/01/21/cocoapods-keys-and-CI/) API keys secret, so no need to go over that twice.\n+\n+Other than that we had already been opening any good abstractions as CocoaPods for anyone to use. All our dependencies were packaged outside of the app, we had no crazy internal SDKs or anything worth hiding within the codebase.\n+\n+### Selling the idea\n+\n+It's one thing to think that it's possible, it's another to do it. I'm glad that I am in a position where I can enact change. I felt no resistence in the process. I kept offering potential aventues for someone to stop me too. I emailed the entire team as I started the process 2 weeks before it happened, I talked to anyone who might write issues or contribute from the design team. As I got further along the process and sent another email out that it was going to happen tomorrow. All I got were 👍 and 🎉s in [GIF](https://itunes.apple.com/us/app/gifs/id961850017?l=en&mt=12) form. So I kept moving forwards till that tweet above.\n+\n+From our dev team's perspective, this is not a brave new world. Our website, [force](https://github.com/artsy/force-public), is open source. Though they operate under different constraints.\n+\n+From the perspective of Artsy, even though opening our code aligns very strongly with our [values of openness](/blog/2015/03/31/the-culture-of-openness-artsy-mobile/) we are still a company. Opening up our codebase lets our competitors see what we're up to in advance, and [closed source](http://code.dblock.org/2015/02/09/becoming-open-source-by-default.html) is the norm for apps. Opening our code and process is also opening ourselves to criticism. ","path":"source/_posts/2015-04-28-open-sourcing-your-apps.markdown","position":56,"original_position":56,"commit_id":"e874b51235254e34bf178a3737cbaef5f782ab11","original_commit_id":"e874b51235254e34bf178a3737cbaef5f782ab11","user":{"login":"ashfurrow","id":498212,"avatar_url":"https://avatars.githubusercontent.com/u/498212?v=3","gravatar_id":"","url":"https://api.github.com/users/ashfurrow","html_url":"https://github.com/ashfurrow","followers_url":"https://api.github.com/users/ashfurrow/followers","following_url":"https://api.github.com/users/ashfurrow/following{/other_user}","gists_url":"https://api.github.com/users/ashfurrow/gists{/gist_id}","starred_url":"https://api.github.com/users/ashfurrow/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ashfurrow/subscriptions","organizations_url":"https://api.github.com/users/ashfurrow/orgs","repos_url":"https://api.github.com/users/ashfurrow/repos","events_url":"https://api.github.com/users/ashfurrow/events{/privacy}","received_events_url":"https://api.github.com/users/ashfurrow/received_events","type":"User","site_admin":false},"body":"Need a comma after \"values of openness\"","created_at":"2015-04-29T12:52:52Z","updated_at":"2015-04-29T12:52:52Z","html_url":"https://github.com/artsy/artsy.github.com/pull/85#discussion_r29332183","pull_request_url":"https://api.github.com/repos/artsy/artsy.github.com/pulls/85","_links":{"self":{"href":"https://api.github.com/repos/artsy/artsy.github.com/pulls/comments/29332183"},"html":{"href":"https://github.com/artsy/artsy.github.com/pull/85#discussion_r29332183"},"pull_request":{"href":"https://api.github.com/repos/artsy/artsy.github.com/pulls/85"}}},"pull_request":{"url":"https://api.github.com/repos/artsy/artsy.github.com/pulls/85","id":34312778,"html_url":"https://github.com/artsy/artsy.github.com/pull/85","diff_url":"https://github.com/artsy/artsy.github.com/pull/85.diff","patch_url":"https://github.com/artsy/artsy.github.com/pull/85.patch","issue_url":"https://api.github.com/repos/artsy/artsy.github.com/issues/85","number":85,"state":"open","locked":false,"title":"[Eigen OSS] Initial blog post about OSSing eigen","user":{"login":"orta","id":49038,"avatar_url":"https://avatars.githubusercontent.com/u/49038?v=3","gravatar_id":"","url":"https://api.github.com/users/orta","html_url":"https://github.com/orta","followers_url":"https://api.github.com/users/orta/followers","following_url":"https://api.github.com/users/orta/following{/other_user}","gists_url":"https://api.github.com/users/orta/gists{/gist_id}","starred_url":"https://api.github.com/users/orta/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/orta/subscriptions","organizations_url":"https://api.github.com/users/orta/orgs","repos_url":"https://api.github.com/users/orta/repos","events_url":"https://api.github.com/users/orta/events{/privacy}","received_events_url":"https://api.github.com/users/orta/received_events","type":"User","site_admin":false},"body":"","created_at":"2015-04-28T21:23:16Z","updated_at":"2015-04-29T12:52:52Z","closed_at":null,"merged_at":null,"merge_commit_sha":"a32457a513ae93633ee512f7ca3669dcfee92017","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/artsy/artsy.github.com/pulls/85/commits","review_comments_url":"https://api.github.com/repos/artsy/artsy.github.com/pulls/85/comments","review_comment_url":"https://api.github.com/repos/artsy/artsy.github.com/pulls/comments{/number}","comments_url":"https://api.github.com/repos/artsy/artsy.github.com/issues/85/comments","statuses_url":"https://api.github.com/repos/artsy/artsy.github.com/statuses/e874b51235254e34bf178a3737cbaef5f782ab11","head":{"label":"artsy:orta-eigen-oss","ref":"orta-eigen-oss","sha":"e874b51235254e34bf178a3737cbaef5f782ab11","user":{"login":"artsy","id":546231,"avatar_url":"https://avatars.githubusercontent.com/u/546231?v=3","gravatar_id":"","url":"https://api.github.com/users/artsy","html_url":"https://github.com/artsy","followers_url":"https://api.github.com/users/artsy/followers","following_url":"https://api.github.com/users/artsy/following{/other_user}","gists_url":"https://api.github.com/users/artsy/gists{/gist_id}","starred_url":"https://api.github.com/users/artsy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artsy/subscriptions","organizations_url":"https://api.github.com/users/artsy/orgs","repos_url":"https://api.github.com/users/artsy/repos","events_url":"https://api.github.com/users/artsy/events{/privacy}","received_events_url":"https://api.github.com/users/artsy/received_events","type":"Organization","site_admin":false},"repo":{"id":3114581,"name":"artsy.github.com","full_name":"artsy/artsy.github.com","owner":{"login":"artsy","id":546231,"avatar_url":"https://avatars.githubusercontent.com/u/546231?v=3","gravatar_id":"","url":"https://api.github.com/users/artsy","html_url":"https://github.com/artsy","followers_url":"https://api.github.com/users/artsy/followers","following_url":"https://api.github.com/users/artsy/following{/other_user}","gists_url":"https://api.github.com/users/artsy/gists{/gist_id}","starred_url":"https://api.github.com/users/artsy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artsy/subscriptions","organizations_url":"https://api.github.com/users/artsy/orgs","repos_url":"https://api.github.com/users/artsy/repos","events_url":"https://api.github.com/users/artsy/events{/privacy}","received_events_url":"https://api.github.com/users/artsy/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/artsy/artsy.github.com","description":"The Art.sy Engineering Developers Blog","fork":false,"url":"https://api.github.com/repos/artsy/artsy.github.com","forks_url":"https://api.github.com/repos/artsy/artsy.github.com/forks","keys_url":"https://api.github.com/repos/artsy/artsy.github.com/keys{/key_id}","collaborators_url":"https://api.github.com/repos/artsy/artsy.github.com/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/artsy/artsy.github.com/teams","hooks_url":"https://api.github.com/repos/artsy/artsy.github.com/hooks","issue_events_url":"https://api.github.com/repos/artsy/artsy.github.com/issues/events{/number}","events_url":"https://api.github.com/repos/artsy/artsy.github.com/events","assignees_url":"https://api.github.com/repos/artsy/artsy.github.com/assignees{/user}","branches_url":"https://api.github.com/repos/artsy/artsy.github.com/branches{/branch}","tags_url":"https://api.github.com/repos/artsy/artsy.github.com/tags","blobs_url":"https://api.github.com/repos/artsy/artsy.github.com/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/artsy/artsy.github.com/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/artsy/artsy.github.com/git/refs{/sha}","trees_url":"https://api.github.com/repos/artsy/artsy.github.com/git/trees{/sha}","statuses_url":"https://api.github.com/repos/artsy/artsy.github.com/statuses/{sha}","languages_url":"https://api.github.com/repos/artsy/artsy.github.com/languages","stargazers_url":"https://api.github.com/repos/artsy/artsy.github.com/stargazers","contributors_url":"https://api.github.com/repos/artsy/artsy.github.com/contributors","subscribers_url":"https://api.github.com/repos/artsy/artsy.github.com/subscribers","subscription_url":"https://api.github.com/repos/artsy/artsy.github.com/subscription","commits_url":"https://api.github.com/repos/artsy/artsy.github.com/commits{/sha}","git_commits_url":"https://api.github.com/repos/artsy/artsy.github.com/git/commits{/sha}","comments_url":"https://api.github.com/repos/artsy/artsy.github.com/comments{/number}","issue_comment_url":"https://api.github.com/repos/artsy/artsy.github.com/issues/comments{/number}","contents_url":"https://api.github.com/repos/artsy/artsy.github.com/contents/{+path}","compare_url":"https://api.github.com/repos/artsy/artsy.github.com/compare/{base}...{head}","merges_url":"https://api.github.com/repos/artsy/artsy.github.com/merges","archive_url":"https://api.github.com/repos/artsy/artsy.github.com/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/artsy/artsy.github.com/downloads","issues_url":"https://api.github.com/repos/artsy/artsy.github.com/issues{/number}","pulls_url":"https://api.github.com/repos/artsy/artsy.github.com/pulls{/number}","milestones_url":"https://api.github.com/repos/artsy/artsy.github.com/milestones{/number}","notifications_url":"https://api.github.com/repos/artsy/artsy.github.com/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/artsy/artsy.github.com/labels{/name}","releases_url":"https://api.github.com/repos/artsy/artsy.github.com/releases{/id}","created_at":"2012-01-06T00:31:22Z","updated_at":"2015-04-10T12:48:56Z","pushed_at":"2015-04-28T21:23:17Z","git_url":"git://github.com/artsy/artsy.github.com.git","ssh_url":"git@github.com:artsy/artsy.github.com.git","clone_url":"https://github.com/artsy/artsy.github.com.git","svn_url":"https://github.com/artsy/artsy.github.com","homepage":"http://artsy.github.com","size":33714,"stargazers_count":61,"watchers_count":61,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":35,"mirror_url":null,"open_issues_count":5,"forks":35,"open_issues":5,"watchers":61,"default_branch":"source"}},"base":{"label":"artsy:source","ref":"source","sha":"e1215b177c8d4719f105e0694f69baed06af230e","user":{"login":"artsy","id":546231,"avatar_url":"https://avatars.githubusercontent.com/u/546231?v=3","gravatar_id":"","url":"https://api.github.com/users/artsy","html_url":"https://github.com/artsy","followers_url":"https://api.github.com/users/artsy/followers","following_url":"https://api.github.com/users/artsy/following{/other_user}","gists_url":"https://api.github.com/users/artsy/gists{/gist_id}","starred_url":"https://api.github.com/users/artsy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artsy/subscriptions","organizations_url":"https://api.github.com/users/artsy/orgs","repos_url":"https://api.github.com/users/artsy/repos","events_url":"https://api.github.com/users/artsy/events{/privacy}","received_events_url":"https://api.github.com/users/artsy/received_events","type":"Organization","site_admin":false},"repo":{"id":3114581,"name":"artsy.github.com","full_name":"artsy/artsy.github.com","owner":{"login":"artsy","id":546231,"avatar_url":"https://avatars.githubusercontent.com/u/546231?v=3","gravatar_id":"","url":"https://api.github.com/users/artsy","html_url":"https://github.com/artsy","followers_url":"https://api.github.com/users/artsy/followers","following_url":"https://api.github.com/users/artsy/following{/other_user}","gists_url":"https://api.github.com/users/artsy/gists{/gist_id}","starred_url":"https://api.github.com/users/artsy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/artsy/subscriptions","organizations_url":"https://api.github.com/users/artsy/orgs","repos_url":"https://api.github.com/users/artsy/repos","events_url":"https://api.github.com/users/artsy/events{/privacy}","received_events_url":"https://api.github.com/users/artsy/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/artsy/artsy.github.com","description":"The Art.sy Engineering Developers Blog","fork":false,"url":"https://api.github.com/repos/artsy/artsy.github.com","forks_url":"https://api.github.com/repos/artsy/artsy.github.com/forks","keys_url":"https://api.github.com/repos/artsy/artsy.github.com/keys{/key_id}","collaborators_url":"https://api.github.com/repos/artsy/artsy.github.com/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/artsy/artsy.github.com/teams","hooks_url":"https://api.github.com/repos/artsy/artsy.github.com/hooks","issue_events_url":"https://api.github.com/repos/artsy/artsy.github.com/issues/events{/number}","events_url":"https://api.github.com/repos/artsy/artsy.github.com/events","assignees_url":"https://api.github.com/repos/artsy/artsy.github.com/assignees{/user}","branches_url":"https://api.github.com/repos/artsy/artsy.github.com/branches{/branch}","tags_url":"https://api.github.com/repos/artsy/artsy.github.com/tags","blobs_url":"https://api.github.com/repos/artsy/artsy.github.com/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/artsy/artsy.github.com/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/artsy/artsy.github.com/git/refs{/sha}","trees_url":"https://api.github.com/repos/artsy/artsy.github.com/git/trees{/sha}","statuses_url":"https://api.github.com/repos/artsy/artsy.github.com/statuses/{sha}","languages_url":"https://api.github.com/repos/artsy/artsy.github.com/languages","stargazers_url":"https://api.github.com/repos/artsy/artsy.github.com/stargazers","contributors_url":"https://api.github.com/repos/artsy/artsy.github.com/contributors","subscribers_url":"https://api.github.com/repos/artsy/artsy.github.com/subscribers","subscription_url":"https://api.github.com/repos/artsy/artsy.github.com/subscription","commits_url":"https://api.github.com/repos/artsy/artsy.github.com/commits{/sha}","git_commits_url":"https://api.github.com/repos/artsy/artsy.github.com/git/commits{/sha}","comments_url":"https://api.github.com/repos/artsy/artsy.github.com/comments{/number}","issue_comment_url":"https://api.github.com/repos/artsy/artsy.github.com/issues/comments{/number}","contents_url":"https://api.github.com/repos/artsy/artsy.github.com/contents/{+path}","compare_url":"https://api.github.com/repos/artsy/artsy.github.com/compare/{base}...{head}","merges_url":"https://api.github.com/repos/artsy/artsy.github.com/merges","archive_url":"https://api.github.com/repos/artsy/artsy.github.com/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/artsy/artsy.github.com/downloads","issues_url":"https://api.github.com/repos/artsy/artsy.github.com/issues{/number}","pulls_url":"https://api.github.com/repos/artsy/artsy.github.com/pulls{/number}","milestones_url":"https://api.github.com/repos/artsy/artsy.github.com/milestones{/number}","notifications_url":"https://api.github.com/repos/artsy/artsy.github.com/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/artsy/artsy.github.com/labels{/name}","releases_url":"https://api.github.com/repos/artsy/artsy.github.com/releases{/id}","created_at":"2012-01-06T00:31:22Z","updated_at":"2015-04-10T12:48:56Z","pushed_at":"2015-04-28T21:23:17Z","git_url":"git://github.com/artsy/artsy.github.com.git","ssh_url":"git@github.com:artsy/artsy.github.com.git","clone_url":"https://github.com/artsy/artsy.github.com.git","svn_url":"https://github.com/artsy/artsy.github.com","homepage":"http://artsy.github.com","size":33714,"stargazers_count":61,"watchers_count":61,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":35,"mirror_url":null,"open_issues_count":5,"forks":35,"open_issues":5,"watchers":61,"default_branch":"source"}},"_links":{"self":{"href":"https://api.github.com/repos/artsy/artsy.github.com/pulls/85"},"html":{"href":"https://github.com/artsy/artsy.github.com/pull/85"},"issue":{"href":"https://api.github.com/repos/artsy/artsy.github.com/issues/85"},"comments":{"href":"https://api.github.com/repos/artsy/artsy.github.com/issues/85/comments"},"review_comments":{"href":"https://api.github.com/repos/artsy/artsy.github.com/pulls/85/comments"},"review_comment":{"href":"https://api.github.com/repos/artsy/artsy.github.com/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/artsy/artsy.github.com/pulls/85/commits"},"statuses":{"href":"https://api.github.com/repos/artsy/artsy.github.com/statuses/e874b51235254e34bf178a3737cbaef5f782ab11"}}}}