コンセプトに共感してくれる人とつくるために。累計130万DL、RunCatをOSS化するまでの8年のトップ画像

コンセプトに共感してくれる人とつくるために。累計130万DL、RunCatをOSS化するまでの8年

投稿日時:
Kyome / 中村 拓人のアイコン

サイボウズ株式会社 / iOSエンジニア

Kyome / 中村 拓人

Xアカウントリンク
OSS応援企画寄付期間:〜11/3 上限金額:100,000円

FindyがTakuto NAKAMURAへ1応援につき100円寄付します

本記事では、「OSS応援企画」として記事の最後に「応援ボタン」を設置しています。1回の応援につき、Findyが100円をOSS団体などへ寄付し、エンジニアの成長とOSSの発展を応援する取り組みです。開発者の想いや取り組みに共感した気持ちが、OSSの支援にもつながっていく、そんな前向きな循環をFindyは目指しています。「応援ボタン」は、1日1回まで押すことができます。記事を読んで「いいな」と感じたら、ぜひボタンを押してあなたの応援の気持ちを届けてください。


はじめまして、中村 拓人(@Kyomesuke)と申します。

本業ではチームワークや業務効率化を支えるクラウドサービスを提供するIT企業でiOSエンジニアとして働きつつ、macOS向けのユーティリティアプリやそれを支えるライブラリの個人開発を趣味でやっています。

また、オープンソースソフトウェア(OSS)活動に強く興味があり、本業と個人開発の両方でライブラリやアプリのOSS化と運用を継続して行なっています。個人開発の中でも、Macのメニューバーで猫が走るシステムモニターアプリ「RunCat」のメンテナンスを8年継続してきており、今年の夏に「RunCat Neo」としてつくり直してオープンソース化しました。

この記事では、RunCatをオープンソースにするに至った経緯と、運営において工夫していることをお話しします。

RunCatとは

RunCatは、Macのメニューバーに常駐するシステムモニターアプリです。メニューバーで猫が走っていて、CPU負荷が高くなるほど速く走ります。数字を読まなくても、猫を見ればMacの調子がなんとなくわかります。

メニューバーで猫が走る様子。ダッシュボードも確認できる

きっかけは、Wi-Fiアイコンのアニメーション

発明のきっかけは、メニューバーをふと眺めていたときのことでした。Wi-Fiが繋がる瞬間に、電波強度を示すシンボルがアニメーションしていることに気づいたのです。ここで何か可愛いものを動かしたら面白そうだと思い、猫を走らせることを思いつきました。

ただ最初は、一定の速度で走っているだけで無味乾燥なものでした。そこで、キーボードのタイピング速度に応じて速度を変えるということも思いついたのですが、キーロガー系の実装はApp Sandboxが壁となり断念しました。

当時の私は小さなものでも試したらとりあえず記事にしていたので、この成果物をQiitaで公開したところ、読者の方から「CPU負荷に合わせて速度を変えてみては」というアイデアをいただきました。それが可能であれば素晴らしいと直感し、ありがたく採用させていただきました。

そう、RunCatの1番の特徴は、技術を公開したことで読者からもらったものだったのです。

想像を超えた広まり

初代のRunCatは機能が小さなアプリということで審査を通すのに難航しましたが、2018年11月にApp Storeで配信することができました。それまでに出してきたアプリは1,000ダウンロードを超えるのに2年ほどかかっていたのですが、RunCatは1週間で2,600ダウンロードを超えました。

この時、マーケティングにおいて「猫」は凄まじいパワーを持っているのだなと感心したのを覚えています。コロナ禍でオンライン会議の画面共有が当たり前になってからは、メニューバーに映り込む猫がそのまま広告になって口コミが広がり、8年で累計130万ダウンロードに至りました。

メニューバーで走るキャラクターやモチーフを「ランナー」として猫以外にも切り替えられるようにしたり、CPU負荷以外のシステム情報も表示できるようにしたりと、ソースコードは非公開のまま1人でメンテナンスを続け少しずつ機能を育ててきました。

ずっと、オープンにしたかった

稼ぐためではなく、自己表現として

私にとって個人開発の1番の目的は、お金を稼ぐことではなく自己表現です。自分のつくったもので、より多くの人に感動してもらったり、生活をより豊かにしてもらったりしたいと思っています。

また、エリック・レイモンド氏の「ハッカーになろう」に強く影響を受けており、技術についてはなるべく広く公開して共有することをモットーにしています。

そう考えると、RunCatは無料で、ソースコードも公開されているのが理想の姿でした。

ところが私は舵を取り損ねてしまいました。

勢いでアプリ内課金を導入

リリース直後のRunCatは完全無料のアプリでした。

ですが、当時の大学研究室の後輩から「収益化しないのは勿体無い」と勧められ、自分自身もアプリ内課金の実装経験がほしいと思っていたため、猫以外のランナーを販売するようにしました。

結果、少額ですが収益が入るようになり、貧乏な学生としては純粋に嬉しかったです。一方で売り物を抱えたことで、ソースコードをオープンにしづらくなってしまいました。

CotEditorのコミュニティに憧れた

その後、就職活動の一環で参加したインターン先でmacOS Nativeというコミュニティを教えてもらい、そこでCotEditorを知りました。CotEditorは、日本人が開発・運用している著名なmacOS向けテキストエディタで、OSSとして公開され、寄付を中心に運営されています。絶対的な柱であるコードオーナーがいて、そのまわりにアプリの愛用者でもある世界中のコミッターがいる。そのコミュニティの姿が、とても素敵に見えました。

いつかRunCatもこの形にしたいと憧れると同時に、アプリ内課金を入れたことを後悔しました。

Star 1万でも「代表作」と呼べなかった

社会人になって数年が経ち、採用に関わるようになると、選考する側としてエントリーシートを読む機会が増えました。他人を評価していると、自然と自分のことも見つめ直すことになり、自分のスキルや設計思想を見せられる代表作を用意したいという気持ちが強くなりました。

ところが、1番知られているRunCatのコードは誰にも見せられません。

そうした中で、macOS版のRunCatとは別に、Windows版の「RunCat 365」を完全なオープンソースとして開発・運用し始めました。私自身はWindowsを主戦場としていないので詳しくありませんが、世界中の有志がIssueやPull Requestで支えてくれ、RunCat 365はGitHubのStar数が1万を超えました。それでも、これを自分の代表作だとは思えないモヤモヤが、ずっと残っていました。私が最も得意とする専門領域はmacOSですし、RunCatはもともとmacOS向けにつくったものです。もちろん、Windows版やiOS版なども含めたRunCatシリーズ全体を代表作と捉えることもできるかもしれませんが、個人的に代表作と呼ぶべきはmacOS版だろうという気持ちが強くありました。

運用に限界を感じた

モヤモヤはありつつもメンテナンスは継続しており、RunCatをより多くの人に使ってもらえるように、多言語対応を進めました。当時は生成AIによる上質な翻訳ツールがなかったので、有志に翻訳してもらう形式をとりました。Windows版はソースコードが丸ごとオープンなのでそのまま翻訳してもらえましたが、macOS版はクローズドなので、アプリの文言部分だけをオープンソースにしました。

結果、日本語と英語に加えて、韓国語、中国語(簡体字・繁体字)、ベトナム語、フランス語、ドイツ語、スペイン語、ロシア語と対応言語が増えていきました。

ここで足枷になったのが、アプリ内課金です。課金アイテムの名前や説明文はアプリのソースコードに含まれず、App Store Connectという開発者向けのWebサービスで1つずつ管理しなければなりません。しかも、8年の間に増やしたランナーは総計約60種類になっており、ランナーを1つ追加するだけで10言語分のローカライズが必要になり、言語を1つ追加するだけで60個のアイテムを編集することになっていました。

ついに、ランナーを売るというビジネスモデルに、運用上の限界を感じました。

また、ランナーを私がつくったものだけに閉じるのではなく、世界中の人が自作したものを共有して使えるようにする「Runner Gallery」を構想し始めていました。みんなでつくって共有するものと、アプリ内課金で売るものは、どうしても噛み合いません。

OSS化はあくまで軌道修正

技術者はお互い様で支え合っているのだから、隠すのではなく公開すべきだという思想。
世界中の人と共創するコミュニティへの憧れ。
代表作を通して、胸を張ってスキルや設計思想を見せたいという思い。
そして極め付けに、ビジネスモデルの運用上の限界。

これらが重なって、RunCatをオープンソースにすることを決めました。しかし、アプリ内課金のビジネス的/技術的な負債は単なるバージョンアップでは解決できません。そのため、別アプリ「RunCat Neo」としてアーキテクチャや技術セットも一新し、一からつくり直すことにしました。機能はすべて無料で使え、収益の仕組みはアプリ内課金によるランナー販売から寄付へと切り替えました。

傍から見ると突然の方針転換に見えるかもしれませんが、私としてはようやく本来目指していた状態へ戻す軌道修正に踏み切ったという感覚でした。

先にOSSだったRunCat 365での経験

OSS化は理想ではありましたが、手放しで最高とは言い難いものです。先にオープンにしていたRunCat 365では様々な課題を経験していました。

まず、複数の改善や修正が混ざったPull Requestが頻繁に届きました。ひとつひとつが独立していればレビューもマージもしやすいのですが、混ざっていると良い部分だけを取り込むことができません。

また、コンセプトに反する機能のリクエストも、複数の人から度々届きました。不採用を伝えるコミュニケーションにはコストがかかりますし、過去に不採用になったIssueを調べずに、同じリクエストが何度も届くことがありました。

コミッター同士が開発の連絡を取り合うためにDiscordサーバーを用意しましたが、開発者ではないユーザーや宣伝目的のユーザーが大量に入ってきました。

そして、人気が出たことによる副作用もありました。RunCatをミームにした仮想通貨が勝手につくられ、公式として承認してほしいというスパムメールが大量に届き、最悪なことに私のGitHubやXの偽アカウントまでつくられていました。

主導権を握ったまま、人を迎え入れる

RunCat Neoでは、公開する前に、コントリビューターを受け入れるための基盤を用意しました。
目指したのは、主導権をコードオーナーが握ったまま、人が入ってこられる形です。

譲らないものを、先に言葉にする

まず、RunCat関連のリポジトリを個人のアカウントではなく、「RunCat Developers」というOrganizationで持つことにしました。

あわせて、RunCatのコンセプトである「シンプルで、可愛くて、ちゃんと便利」の3本柱を示すWebページをつくりました。このコンセプトに共感してくれる人にコミットしてもらいたい、という意思表示です。

RunCatの3つのコンセプト「シンプル」「可愛い」「ちゃんと便利」を示したWebページ

譲らない部分を先に言葉にしておくと、断るときの説明が変わります。「あなたの提案が悪い」ではなく、「コンセプトに合わない」と言えるようになるのです。

たとえば、システム情報を確認するダッシュボードのレイアウトを、細かくカスタマイズできるようにするPull Requestをいただいたことがあります。

一見すると機能強化ですが、詳しくない人にとっては設定が複雑になりますし、見た目の情報量も増えすぎてしまいます。3本柱の1つである「シンプル」を欠くものだったので、お断りしました。

ガードレールを設置する

次に、貢献の仕方を書いたCONTRIBUTING.mdと、Issueテンプレート、Pull Requestテンプレートを用意しました。リクエストが定型に沿って届くようにするためのガードレールです。

GitHubでIssueを作成するときに表示されるテンプレートの選択画面

機能要望テンプレートの具体的な記入項目

これらに従っていないものは、原則として扱わずに閉じることにしています。冷たく聞こえるかもしれませんが、基準が文書として公開されていれば、従う側も判断する側も迷わずに済みます。

Discordサーバーでは、コミュニティ機能のオンボーディングを有効にしました。サーバーに入る前に、趣旨の注意書きと目的別の案内が表示されます。

AIによる低品質なPull Requestを予防するために、AI向けのルール文書やSkillもリポジトリに含めています。コントリビューターがAIに作業を任せたときにも、プロジェクトの流儀に沿ったコードが出てきやすくなります。

開いてみて、変わったこと

RunCat Neoを公開してから、新しい交流が生まれています。

RunCat Neoには、ユーザーが指定したJSONファイルの情報を読み取り、ダッシュボードにカードとして表示できる「カスタムメトリクス」という機能があります。

そのサンプルをいくつかリポジトリに含めているのですが、公開直後からさまざまなアイデアがPull Requestの形で届きました。8年間1人でつくってきた私にとって、とても新鮮な体験でした。

Runner Galleryにも、自作ランナーの投稿が多数届いています。提供者が私だけではなくなり、ユーザー同士の繋がりが広がっていくと思うと楽しみです。

寄付も、想像していたより多くの方がしてくださっています。強く期待していたわけではなかったので、非常に嬉しく思っています。

もちろん、良い反応ばかりではありません。既存の機能のほとんどをRunCat Neoに引き継いだこともあってか、大きなクレームはそれほど届きませんでしたが、一部機能の廃止には不満の声をいただいています。ただ、こうしたやりとりも、IssueやPull Requestという形で健全に進められています。

これからOSSに挑戦しようと思っている人へ

OSSは、とてもグローバルな場です。RunCat 365のコアメンバーにはコロンビアやインドの開発者がいて、日本人は私のほかにいません。Discordでは、AI翻訳にも頼りながら英語でやりとりしています。海外のエンジニアの友人をつくるには、最高の場だと思います。

AIが普及した今、必要な機能は既存のライブラリを探すより、AIにつくってもらうほうが早い場面も増えました。それでも、世界中の人と1つのプロダクトを一緒に育てる楽しさや、知識を公開して社会に還元する喜びは、OSSだからこそ得られるものです。

自分のコードを人に見せることには、抵抗があるかもしれません。けれども私は、それに勝るメリットがあると思っています。
RunCatの猫が速度を変えて走るようになったのも、最初にQiitaで技術を公開したからでした。

まずは小さなものでかまいません。
あなたのつくったものを、開いてみると世界が広がるかもしれません。

50
50