読者です 読者をやめる 読者になる 読者になる

JasperというGitHub Issue Readerを作りました

先にまとめを書いておきます

  • GitHubの大量のIssue/PRを効率的に閲覧できるJasperというソフトウェアを作りました
  • 閲覧したいIssueのStream(RSSフィードみたいなもの)を好きな条件で作成することができます
    • 条件はメンションされた、作成した、特定のリポジトリなど、かなり柔軟に設定できます
  • Mac/Windowsの両方に対応しており、$12で販売中です
    • 30日間のフリートライアル版もあります

背景

ソフトウェアエンジニアとして仕事や個人で活動をしていると、GitHubやGitHub Enterprise(GHE)を使うことが多いと思います。 僕も仕事ではGHEを使っており、個人ではOSSを作っているのでプライベートな活動でもGitHubをよく使っています。

そんなGitHubですが、一つ大きな不満があります。 それはIssueやPull Request(PR)を効率的に処理・閲覧できないというものです。 特に仕事でGHEを業務の中心として活用している場合、大量のissueやPRのメールに溺れてしまいます。 そして、気になるIssueをブラウザのタブで大量に開いた状態にしてしまいます。 メンションされたもの、アサインされたもの、ウォッチしてるリポジトリのもの、自分がだしたPRなどなど。 OSSの活動を積極的に行っていたり、色々なOSSをウォッチしているエンジニアも同じような悩みがあると思います。

そんな不満を解消するためにGitHub専用のIssue Readerを作りました。

Jasper

Jasperは大量のIssueやPRを効率的に処理・閲覧できることを目的につくりました。 その中核となる機能が「Stream」と呼んでいるものです。 StreamはRSSフィードのようなものを想像してもらうと、わかりやすいと思います。 ただし、RSSフィードと違い、閲覧したいIssueの条件を専用のクエリを使って自由に設定することができます。

例えば、以下の様なStreamを作ることができます。

  • fooさんが出したPR: is:pr author:foo
  • nodejs organizationで、fooさんがメンションされたもの: user:nodejs mentions:foo
  • nodejs organization以外の場所で、nodejsという単語が含まれるもの(所謂エゴサーチ): -user:nodejs nodejs

Streamを使えば複数のリポジトリを横断したり、興味のあるものだけを抽出して効率的にIssue/PRを閲覧することができます。 Streamに使える条件はここを御覧ください。

Streamで解決できるもの/できないもの

僕はGitHubのIssueを見る人には3段階の欲求があると考えています。

  1. 自分が直接関わっているIssueを見逃したくない/見逃せない
  2. チームメンバーが関わってたり、隣のチームのリポジトリのIssueを見たい
  3. 自分に関係があったり、興味がありそうなIssueを発見したい

Streamはこれらの欲求全てを解決できると考えています。 ただし、Streamだけでは使い勝手が悪い部分もあるので、サブ機能としてFilterSortStarYour Issuesなども提供しています。

逆に、Streamで解決できないものとして「プロジェクト管理としてIssueを使う」というものがあります。 この問題を解決しようとしているのがZenHubwaffle.ioHuBoardなどです。 これらのツールはIssueをカンバンスタイルで表示して、プロジェクト管理として使う設計となっています。 *1

仕組み

Jasper(Stream)の仕組みはすごく単純で、内部的にはGitHubの検索APIを使っているだけです。 GitHubの検索APIは非常に強力に作られており、色々な条件をクエリを使って指定することができます。 この「GitHubの検索APIで使えるクエリ」がStreamに指定するクエリそのものです。

そして、検索APIをポーリングすることで、Issueを更新しています。 ポーリングと聞いて「え?」と思われたかもしれません。ですが、JasperはGitHubの検索APIの実行回数の制限内で動くように作られています。 実行回数の制限は60秒で30回となっており、Jasperはデフォルトで10秒に1回のポーリングになっています。これはStreamがどんなに増えても10秒に1回しかポーリングしないので、実行回数の制限に引っかかることはありません。 ただし、Streamの数が増えれば増えるほど、1つのStreamあたりの更新間隔は長くなってしまいます。

技術スタックとしてはElectron + ES2015 + async/await + React + SQLite3となっています。 特にasync/awaitは非同期処理の実装効率を非常に上げてくれたように感じます。

謝辞

Miwa Kuramitsuさん、めちゃ格好いいアイコンを作っていただきありがとうございました!

Kei Nakazawaさん、Windows版開発のきっかけを作っていただきありがとうございました!

テストユーザとして参加してくださったみなさん、色々なフィードバックをありがとうございました!




というわけで、Jasperに興味を持たれた方は是非フリートライアル版を使ってみてください。

https://jasperapp.io

フィードバック等もお待ちしております。

https://github.com/jasperapp/jasper

*1:ただし、JasperでもStreamをカンバンスタイルで表示することができれば、同じような使い方もできるのではないかと検討中です