Inkdropのロードマップ vol.5

Share
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万円を超えました 🎉

Stripeのダッシュボード

その売上で開発機に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を動かすためにいくつかの即席パッチを当てています。それでも尚、以下のような問題に直面するかもしれません:

残念ながら、上記の問題は現在の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をより洗練し成熟させていくためには、あなたのサポートが必要不可欠です。ぜひロードマップに関するあなたのご意見をお聞かせください。

Read more

個人開発で日本から海外へ、10年間の歴史 — ひろしさんとの対談(前編)

個人開発で日本から海外へ、10年間の歴史 — ひろしさんとの対談(前編)

数週間前、ひろしさんのポッドキャストにゲストで出演しました。お互いの長い個人開発の経験について語り合いました。英語版を作成する過程で、日本語でも綺麗に整形した書き起こしが出来たので、こちらに掲載します。お楽しみください。 ※ギアアイコンをクリックして、音声と字幕を日本語に変更できます。 00:00 イントロ:TAKUYAさんようこそ 01:32 TAKUYAさんの自己紹介:WalknoteからInkdropまで 04:54 独立への踏み切り方:慎重派と勢い派 06:51 個人開発がフリーランス案件につながった 09:17 Inkdropで食えるようになるまで 12:15 なぜ最初から海外市場を狙ったのか 14:54 AI登場前、英語コピーに苦戦した話 16:18 AIバイブコーディング時代をどう見ているか 17:24 全てのコードを一行ずつレビューする使い方 21:06 AIは新幹線:速さの先にあるもの 25:53 AI時代に「感性」が大事になる 27:

By Takuya Matsuyama
「一汁一菜」にAI時代の生き方が詰まっている

「一汁一菜」にAI時代の生き方が詰まっている

どうも個人アプリ作家のTAKUYAです。 今回は、AI時代を開発者・クリエイター・表現者としてどう健やかに生きるか、について考えていることをシェアしたいと思います。ここでの「健やかに生きる」とは、心身の健康を保ちながら、ものづくりを楽しみ続けるという意味です。 読者の中にも、最近のAIの急速な進化の中でどう生き残り、さらに活躍していくかを悩んでいる方は多いのではないでしょうか。正直、すべてに対する正解はわかりません。未来を正確に予測できる人はいないからです。 でも自分は、ソフトウェア寄りのアーティストとして生きる上で大事なのは、「戦略」や「堀(moat)」を築くことよりも、「生きる方向性」 だと思っています。 人生とは速度ではなく方向である – ゲーテ 自分はどこに行きたいのか?何を見たいのか?それが大事です。戦略は状況に合わせて柔軟に変えればいいからです。 今回は、日本の文化からいくつかの生き方の原則を探ってみたいと思います。 最近、料理研究家の 土井善晴 さんの 「一汁一菜でよいという提案」 を読んで、日々のリズムを健やかに保つためのヒントがたくさん詰まっていると感じまし

By Takuya Matsuyama
Claude Codeをtmuxのポップアップウィンドウで継続的に走らせる方法

Claude Codeをtmuxのポップアップウィンドウで継続的に走らせる方法

💡本記事は英語ブログの日本語訳です。 どうも、TAKUYAです。 AIコーディングでは専らClaude Codeを使っています。最初はtmuxでターミナルの右側にペインを分割して使っていたのですが、幅が狭すぎてメッセージやdiffがまともに表示できず、使いづらかったです。 <Prefix>+zでペインを最大化すればいいのですが、毎回やるのは面倒でした。 そこで、ポップアップウィンドウでClaude Codeを起動するようにしました。キーバインドを押せばセッションが開き、閉じてもバックグラウンドで動き続けるので、すぐに再開できます。 この記事では、それを実現するためのtmuxの設定方法を紹介します。 動画で見る(英語): ポップアップウィンドウはサブプロセスを維持できない tmuxのdisplay-popupコマンドを使うとポップアップウィンドウを表示でき、ちょっとしたツールにすぐアクセスするのに便利です。 僕はlazygitでgitの状態をサッと確認するのに使っています: bind -r g display-popup -d '#{pane_current_path}'

By Takuya Matsuyama
Keychron K2 HEを無刻印化する手順

Keychron K2 HEを無刻印化する手順

どうもTAKUYAです。KeychronさんにK2 HEをお願いしたら音速で送ってくれたので、無刻印化してみました。どうやったのか過程をシェアします。 Unboxing 上はKeychron Q1です。これは3年間ぐらい使ってきました。キーキャップが若干くたびれていますね。でも問題なく今まで使えていました。そろそろ飽きてきたので新しいキーボードを試したいと思い、前から気になっていたK2 HEを試すことにしました(写真下)。 Amazon | 【国内正規品】Keychron K2 HE ラピッドトリガー ワイヤレス カスタムキーボード、ホールエフェクトGateronダブルレール・マグネットスイッチ、2.4GHz・Bluetooth無線対応、QMKプログラム可能、アルミ+ウッドフレーム、USレイアウト、RGBライト、Mac Windows Linux対応 (ブラック) | Keychron | パソコン用キーボード 通販【国内正規品】Keychron K2 HE ラピッドトリガー ワイヤレス カスタムキーボード、ホールエフェクトGateronダブルレール・マグネットスイッチ、

By Takuya Matsuyama