Inkdropのロードマップ vol.5

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

Inkdrop v6 Canary版リリースしました — 新Markdownエディタやその他新機能盛り沢山

Inkdrop v6 Canary版リリースしました — 新Markdownエディタやその他新機能盛り沢山

Inkdrop v6.0.0 Canary版リリースしました — 新Markdownエディタやその他新機能盛り沢山 こんにちはTAKUYAです。 v6.0.0 の最初の Canary バージョンをリリースしました 😆✨ v6では、アプリのコア機能の改善がたくさん盛り込まれています! * リリースノート(英語): https://forum.inkdrop.app/t/inkdrop-desktop-v6-0-0-canary-1/5339 CodeMirror 6 ベースの新しいエディタ フローティングツールバー v5ではツールバーがエディタの上部に固定されており、使っていないときもスペースを占有していました。 v6では、テキストを選択したときだけ表示されるフローティングツールバーに変わりました。 GitHub Alerts 構文のサポート Alerts の構文が正しい色と左ボーダーでハイライトされるようになりました。 ネストされたアラートや引用にも対応しています。 また、アラートタイプの入力を支援する補完機能も追加されました。 スラッシュコマンド 空行で /

By Takuya Matsuyama
AIのお陰で最近辛かった個人開発がまた楽しくなった

AIのお陰で最近辛かった個人開発がまた楽しくなった

AIのお陰で最近辛かった個人開発がまた楽しくなった こんにちは、TAKUYAです。日本語ではお久しぶりです。僕はInkdropというプレーンテキストのMarkdownノートアプリを、デスクトップとモバイル向けにマルチプラットフォームで提供するSaaSとして、かれこれ9年にわたり開発運営しています。 最近、その開発にClaude Codeを導入しました。エージェンティックコーディングを可能にするCLIのAIツールです。 最初の試行は失敗に終わったものの、徐々に自分のワークフローに馴染ませることができました。そして先日、アプリ開発がまた「楽しい」と感じられるようになったのです。これは予想外でした。 本稿では、自分がエージェンティック・コーディングをワークフローに取り入れた方法と、それが個人開発への視点をどう変えたかを共有します。 * 翻訳元記事(英語): Agentic coding made programming fun again 自分のアプリに技術的負債が山ほどあった ご想像のとおり、9年も続くサービスをメンテするのは本当に大変です。 初期の頃は新機能の追加も簡単で

By Takuya Matsuyama
個人開発を7年以上続けて分かった技術選択のコツ

個人開発を7年以上続けて分かった技術選択のコツ

個人開発を7年以上続けて分かった技術選択のコツ InkdropというMarkdownノートアプリを作り続けて7年になる。 お陰さまでその売上でずっと生活できている。 これまで個人開発でどう継続していくかについて「ユーザの退会理由をあれこれ考えない」とか「アプリの売上目標を立てるのをやめました」とか、ビジネス面あるいはメンタル面からいろいろ書いてきた。 今回は、技術面にフォーカスして、どう継続して開発していくかについてシェアしたい。 TL;DR * 最初はとにかく最速でリリースする事を最優先する * 迷ったら「ときめく方」を選べ * 程よいところで切り上げて開発を進める * 使っているモジュールがdeprecatedされるなんてザラだと覚悟する * 古いから悪いとは限らない * シンプルにしていく * 老舗から継続の秘訣を学ぶ * 運ゲー要素は排除しきれない 最初はとにかく最速でリリースする事を目標に技術選定する 開発計画とビジネス計画は切っても切り離せない。 コーディングに傾倒するあまり完璧主義に陥って結局リリース出来ないまま頓挫してしまう個人開発者は多い

By Takuya Matsuyama
子育て中の個人開発者の一日

子育て中の個人開発者の一日

子育て中の個人開発者の一日 どうもTAKUYAです。 久しぶりに生活まわりの事を書きたい。自分はInkdropというMarkdownノートアプリを売って生きている。 子供も無事順調に成長しており、あと数ヶ月で3歳になるというところで、イヤイヤ期もやっと終わりが見えてきた。 生活パターンもなんとなく定着しつつあるので、ここで一旦どんなルーティンなのか書き出してみる。ちなみに当方今年で40歳。 平日の1日の流れ * 06:30 妻と子供起床、朝食 * 07:10–30 俺起床、朝食 * 07:40 布団を畳んで子供を着替えさせる。妻はその間に化粧や通勤の準備 * 08:00 ストレッチと軽い筋トレ(腕立て50回、スクワット100回) * 08:10 妻と子供を見送る。15分前後瞑想 * 08:30 散歩 * 09:00 作業開始(カフェまたは家) * 11:00 昼飯 * 12:00 ダラダラする * 12:30 作業再開(だいたい家)

By Takuya Matsuyama