Inkdropのロードマップ vol.5

Inkdropのロードマップ vol.5
個人開発者として成功し続けるための戦略
英語で先に書いてから日本語に訳しています
どうもみなさん、お元気ですか。Inkdrop作者のTAKUYAです。先月、Inkdrop v5がリリースされました。よりあなたのノートの整理を支援する新しい機能や改善がふんだんに盛り込まれました。みなさんが気に入ってくださっているのをみてとても嬉しく思います。そして今、ロードマップvol.4がついに完走を迎えました。めでたい。では早速Inkdropの未来について語りましょう。
TL;DR
- 総売上は2,000万円を超えました
- 僕は自分と似ている人を助けます
- 僕はコア体験に集中します。そしてあなたの好きに拡張できるようにします
- モバイルプラットフォームで1stクラスの体験を実現する
なかなか遠いところまでやってきました
Inkdropはロードマップを毎年アナウンスしています。今回のロードマップはVolume 5を数えます。5です!なかなかの所にまで来ました。最初のロードマップを発表したのは4年前になります。それもこれも支えて下さっているみなさんのお陰です。ありがとうございます。売上は幸いコロナ時代にも関わらず安定しており、総売上は2,000万円を超えました 🎉

その売上で開発機にMac Proを買うことが出来ました。初期の頃の事はよく覚えています — — 沢山の人が、僕が個人開発だから何年持つか分からないし信用出来ないという理由でInkdropを使いたくないと言っていました。でもご覧の通り、僕もプロジェクトも健在しています。これはInkdropが突然あなたのデータと共に消え去るなんて事はない裏付けとなるでしょう。
僕は自分と似ている人を助けます
なぜこの僕が燃え尽きずにこのプロジェクトを何年も続けられたかというと、その大きな理由はメインのターゲット層に大きく関係しています。僕は自分と似た人に向けて作っています — — Markdownをプレーンテキストで書き、個人のメモ用途で使いたい人たちです。つまり、これはとてもニッチな製品です。万人向けでは決してありません。なので、今まで沢山の機能要望に対してノーと言い続けてきたため、沢山の人がInkdropから去りました。自分が使いもしない機能を追加する代わりに、コアの機能の改善に集中して取り組み続けてきました。これが走り続けるために最も大事なファクターです。売上を倍にするため、ターゲット層を広げることも出来たでしょう。例えば、Markdownとは何かすら知らない初心者のプログラマーは世の中にごまんといます。彼らをターゲットにするのは確かに良さそうです。でももしやったら、すぐさま何が分からないのか分からないような問い合わせに埋もれるのは間違いありません。それらに答えようとしても、彼らは僕の言ってる事がさっぱり分からないでしょう。謎の理由で怒った人たちの対応にも追われることになります。そうして僕は疲れ果てて、開発の時間をなんとかこじ開けるために、ユーザサポートを任せる人を雇う事になります。しかしそれでは解決しません。サポートチームの人材を教育し、マネージメントする必要が生じます。そして倍増したはずの売上は彼らの報酬に消えます。この道を辿らなくて本当に良かった。僕は小さくある事を愛しています。小さいという事は、自由な事です。
つまり、僕は万人を喜ばせる事はしません。それが走り続けるために重要な事です。でも、あなたの声は喜んで聞きます。過去のリリースノートをご覧ください。各リリースで、コントリビュートして下さった人をクレジット記載しています。ご覧の通り、多くの追加された機能と修正された問題は、ユーザの皆さんからリクエスト・報告いただいたものです。それはInkdropがあなたと共に進化してきたという意味です。僕は全てを把握している訳ではありませんから、あなたのフィードバックはいつも僕に考えさせ、新しいアイデアを与えてくれます。最初は機能要望にノーと断っても、他の人からも同じ要望を受け続ければ、再検討します。なので、ぜひ遠慮せずにあなたの考えを聞かせてください。いつもフィードバックありがとうございます!

僕はコア体験に集中します。そしてあなたの好きに拡張できるようにします。
機能要望は当初から変わってきています。v5にもなり、基本的にノートアプリとして基本的に必要な機能は揃いました。ユーザさんがそれらに満足しているからか、最近では特定の用途に特化した提案をしてくる傾向にあります。それは僕が正しい問題に取り組んできている事を示します。それらの正しい問題に取り組めば取り組むほど、人々はユニークなアイデアを思いつくようになります。もしアプリが正しい問題を解決していなければ、あなたはアイデアを提案する前にとっくに使うのをやめてしまっているでしょう。しかしながら、一部のアイデアはアプリの基本コンセプトに影響を与えるため、残念ながら受け入れられません。同時に、僕らには沢山の個人的好みとユースケースがあることも理解しています。そこでこれらの要望に対しては、プラグインで実現できないかまず考えます。Inkdropは様々な機能が実現できるパワフルなAPIを提供しています。プラグインの数は既に100個を超えました。素晴らしい。彼らの貢献のお礼にプラグイン開発者ライセンスを提供しています。なので、僕は特定のユースケースのための機能を付けるのではなく、パワフルなAPIを提供する事に集中します。v5では、これまでCLIでしか出来なかったプラグインのインストールをもっと手軽にできるようにGUIを備えました。
一方で、このようにアプリをシンプルで簡潔に保とうと努力していますが、既に一部の人たちは本アプリが「いろいろ出来すぎる」と言っています。これにはちょっと同意します。更なる機能の対応は、必ずしもすべての人にとっていいニュースとは限りません。僕はこのアプリをAdobe製品のように勉強しなければ使えないような膨れ上がったものにしたくありません。最良のユーザ体験とは、ユーザがドキュメントを読まなくても使える事です。
という訳で、僕はコア体験に集中します。そしてみなさんが自由に拡張できるように配慮します。
モバイルプラットフォームで1stクラスの体験を実現する

オーケー、では僕はこのロードマップでどんなコア体験に取り組むのでしょうか?それはモバイル版です。これまでも各ロードマップでモバイル版の改善を掲げて取り組んできましたが、その完成度はデスクトップ版と比べてもまだまだ劣っています。iOSとAndroidの両方において、パフォーマンスや編集体験に深刻な問題が未だにあります。それらの問題を解決して、モバイル版でのノートの読み書きをもっと快適にしたいと思います。では行きましょう。
E2EEでの画像読み込みパフォーマンスを改善
モバイル版はReact Nativeで開発されています。そのお陰でデスクトップ版とJavaScriptの大部分のコードベースを共通化出来ています。個人開発者として、それはモバイル版を素早く開発するには素晴らしい恩恵でした。しかしながらReact Nativeも銀の弾丸ではありません。画像や暗号といったバイナリ処理にはめっぽう弱いという点があります。例えば、PouchDBをハックしてRNで画像の添付を取り扱えるようにしました。更に、RNはNodeJSにある crypto
のようなモジュールは提供しません。そのため、モバイル版でEnd-to-End暗号化に対応するためにreact-native-cryptoという pbkdf2
のような暗号系関数をshimしてくれるライブラリを使わざるを得ませんでした。それは全てJavaScriptで実行されるため、一定量のデータを取り扱うにはあまりパフォーマンスの点でよくありません。これらのRNの弱点はパフォーマンスにおいて以下のような問題を引き起こしています:
もし大きな画像をノートに添付していた時、その読み込みはとても時間がかかるか、最悪永遠に読み込まれません。その場合悪いことに、JavaScriptのメインスレッドをブロックするので、アプリそのものが反応しなくなります。
より高速かつ非同期的な画像と暗号データの処理の実現に向けて、ネイティブモジュールを作って解決したいと思います。そしたらreact-native-crypto
の依存も無くせるかもしれませんし、アプリの内部がよりシンプルになります。
iOSとAndroid向けのネイティブなMarkdownエディタの実装
モバイル版の現在のMarkdownエディタの実装はWebView内でCodeMirrorを動かして実現しています。CodeMirror自体が苦しんでいるように、WebViewはタッチスクリーン上でのエディタの提供には適していません。僕はAndroidとiOS上でCodeMirrorを動かすためにいくつかの即席パッチを当てています。それでも尚、以下のような問題に直面するかもしれません:
- Spellcheck option in iOS version
- Typing in non-viewable area
- Android annoyances that prevent me from using it
- Cannot write korean in ipad(iOS)
- Android Version disables glide typing on Google Keyboard
- Typing in large notes on Android is very slow
- [Android] 文字列選択操作の不具合
残念ながら、上記の問題は現在のWebベースの実装では解決できません。いろんなエディタライブラリをiOSとAndroid上で試しましたが、どれも基本はPC向けに設計されているため、上手く動きませんでした。その上、Androidはauto-correctなどの入力補助機能を制御するためのソリッドなAPIを提供していません。AndroidはCodeMirrorのステートを頻繁に荒らします。そのため、モバイルデバイス上での編集体験はひどいものとなってしまっています。
新バージョンのCodeMirrorが目下開発されており、彼らはタッチスクリーンもサポートするよと目標を掲げていますし、僕らはそれに期待することも出来るでしょう。しかしながらプロジェクト開始から既に2.5年経っており、ETAは未だ不明です。Xi Editorの開発者が回顧するように、コードエディタを作るのはめちゃくちゃ大変で時間がかかります。
CodeMirror.nextはまだまだ初期開発段階のようなので、別の道を検討したいと思います。それはネイティブのMarkdownエディタを開発することです。はい、それは大きなチャレンジになるでしょう。上手くいくかどうか分かりません。でも聞いてください、その実現のために良さそうなアイデアがあります。こちらが今考えているネイティブエディタのアーキテクチャです:

iOSでは UITextView
、Androidでは EditText
をベースにして、バックエンドとしてCodeMirrorを動かしてシンタックスのハイライトや入力補助を行うというアイデアです。このアイデアはHighlightrというコンポーネントを見つけた時に思いつきました。これはhighlight.jsをコアに使っています:

CodeMirrorの方がIncremental Parsingに対応しているのでより良く動くはずと考えます。現行のモバイル版にてダーティ・ハックを既にしているため、CodeMirrorの内部構造は既に少し理解しています。HighlightrはHTMLをNSAttributedString
に変換していますが、それはパフォーマンス面であまり良くないでしょう。CodeMirrorをバックエンドにすることで、シンタックスのメタデータをより効率的かつインクリメンタルに取得できます。その方が良さそうです。
これはReact Nativeのコミュニティへ恩返しをする良い機会だという事に気付きました。彼らも同様にソリッドなコードエディタコンポーネントを求めているはずだからです。Markdownだけでなく、HTML, CSS, PythonやRubyなどを書く用途にも使えます。もしこの試みが成功してオープンソースとして公開したら、コミュニティからそれなりの注目が得られるのではないかと思っています。それはInkdropのマーケティングとしても良さそうです。
AndroidのEditTextとiOSのTextKitをいじって、軽いPoCを作り、いけそうだと判断しました。トライしてみましょう。
シェアターゲット&シェアエクステンション
僕らはウェブ上やアプリ内で様々な情報のピースを見つけます。それらを素早くストックできることは重要です。その実現には各プラットフォームでネイティブ実装が必要となります。ただし、ウェブクリッパーではない事に注意してください:
PDFとHTML形式のエクスポート
よりよいエクスポート対応は前回のロードマップに掲げていました。上記のようにネイティブエディタの実装を検討していたので、これはまだ対応していません。今回のネイティブ実装が上手くいったら取り組みます。
ノート内検索
長いノートの閲覧に必要です。
キーバインディング
ハードウェアキーボードを使っている場合、キーバインディングは素早いアクションの実行が出来るため、生産性の向上に大きく寄与します。しかしRNはキーバインディングに対応するAPIを持っていないため、各プラットフォームに特化したネイティブ実装が必要になります。
APIの改善
Command palette
Inkdropには沢山のコマンドを備え、キーストロークに割り当てて使うことが出来ます。でもAtomやSublime Textのようにコマンドパレットがあれば、どんなコマンドがあるのか見つけやすいですし、キーマップを設定しなくてもすぐに試すことが出来ます。
Let’s make it together
最後までお読みくださりありがとうございます。Inkdropをより洗練し成熟させていくためには、あなたのサポートが必要不可欠です。ぜひロードマップに関するあなたのご意見をお聞かせください。