Inkdrop v5をリリースしました

Inkdrop v5をリリースしました

Inkdrop v5をリリースしました

より高速なデータ同期とアプリ起動、アイコンの刷新とよりシンプルになったUI、プロジェクトのような動作が加わったノートブック、そしてプラグイン管理GUIなど

英語で書いてから日本語訳しています ⇒ English version is available here.

こんにちは、TAKUYAです。本日Inkdrop v5をリリースしました。前回のアップデートから5ヶ月ぶりとなります。沢山の新機能、改善やバグ修正があります。アナウンスできてとても嬉しいです。ベータ版のテストを手伝ってくださった皆さんに感謝します。ありがとう、Andi, can_Y, ebigram, Erdem, Gustavo, James, Mike, Rael, tdudz, Zhuolun!さて、本稿ではv5の新しく加えられた変更点についてご紹介して行きます。

日本語字幕あります。CCボタンをタップ

Inkdropとは? — 4年かけて作ったアプリ

A Markdown note-taking app that syncs

偶然この記事に出会ったみなさん: はじめまして!僕はInkdropを4年間ひとりで開発しています。時が経つのは早いですね。これはプレーンテキストのMarkdownノートアプリで、macOS、Windows、Linux、iOSそしてAndroidと様々なプラットフォームで動作し、End-to-end暗号化方式で安全に同期します。最初は自分のために作りました。当時、コードの構文ハイライトやvimキーバインディング、ハック可能性などのプログラマーフレンドリーな機能を備えたEvernoteの代替アプリをずっと探していまいた。でも全然見つけられなかったので自分で作ることにしたのがきっかけです。良いノートアプリを作る旅は想像するよりも本当に険しいものでした。でも4年間耐え忍び、改善し続けました。当ブログでは開発を通して学んだことをシェアしています。個人開発のビジネスにご興味のある方はご覧ください:

去年は、技術的負債を綺麗にすべくアプリをイチから作り直すという苦行(笑)を無事やり遂げました:

今回のアップデートはこれらの積み重ねの上に乗るものです。

実は完全な独りきりの開発ではありません

独りきりで良いエディタを作るのは至難の業です。なぜならデベロッパーには数え切れないほど沢山の個人の好みや「あるといい」機能があるからです。この問題に対処すべく、InkdropではパワフルなAPIを提供して、みなさんに自由に新たな機能や見た目を追加できるようにしました。僕自身はコア機能の改善に勤しむ傍ら、ついにプラグインの数は100個を超えました!そのうち80%がユーザコミュニティ製のプラグインです。素晴らしいですね。ユーザさんが楽しみながらInkdropをハックしていて僕もとても楽しいです。プラグインはこちらから閲覧できます。

プラグインは僕が沢山のオプション機能を追加する代わりに、コアの重要な機能の改善に集中することが出来ます。なので、Inkdropではプラグイン開発者ライセンスでプラグインの開発を推進しています:

Inkdropプラグイン開発者ライセンスのご案内
プラグインを開発するとInkdropを永久無料で使えるようになります

プラグインを作れば、Inkdropを永久無料で使えるというライセンスです。

より高速な同期とアプリ起動

ではまずはv5におけるパフォーマンス改善についてお話したいと思います。

データベースのクラスタをスケールアウトしてから、データ同期が予想外に遅くなってしまいました。調査の結果、サーバ間のRTTは166msと遅く、それは各サーバが異なるリージョンで動いているのが原因でした。つまりネットワークトポロジが悪かったのです。そこでサーバを同一リージョンに移し、しかしAvailability Zoneは別々の配置にしたところ、RTTは1ms以下に改善しました。その結果、ノート同期速度は以前の3倍になりました!

アプリの起動速度も格段に良くなりました。InkdropはElectron製のアプリなのですが、以前のバージョンでは起動に4秒もかかり、とても遅いものでした。今回、v8 snapshotsを利用することでこの起動速度の改善に成功しました。以下をご覧の通り、アプリの起動は1,000ミリ秒速くなりました。起動速度が遅いとストレスですよね。今回、この問題が解決できてとても嬉しく思います。具体的にどうやって達成したのかは以下の記事に書きました:

Electron製アプリの起動速度を1,000ミリ秒速くする方法
JavaScriptの読み込みはめっちゃ遅い / require() は必要になるまで呼び出すな / V8 snapshotsを使う

以下の通り、とても速いです。

アイコンの刷新とよりシンプルになったUI

ツールバーのアイコンは今ではちょっと古い感じがしていました。昨今の高解像度なディスプレイでは、それらは少々太すぎました。その上、エディタ上のアクションボタン群は幅を取りすぎていて、小さいディスプレイをお使いの方には使いづらいという問題がありました。

そこで、アイコンを刷新し、エディタアクションボタン群を再配置して、よりモダンでクリーンにしました:

右上の「 ︙ 」ボタンをクリックすると、エディタドラワー(Editor drawer)が表示されます:

今回の改善にはStreamline Iconsを使いました :)

プロジェクト的な動作が加わったノートブック

デベロッパーのみなさんは、沢山のプロジェクトやサイドプロジェクトを抱えていることでしょう。Inkdrop v4では柔軟性が足りなかったため、また一つプロジェクトが増えるたびに、ノートの整理がやりづらくなっていました。たとえ沢山のノートブックやタグやノートを作ったとしても、Inkdropは常にあなたの日頃のハックの努力をメモできる場所でなければなりません。その実現に向けて、今回のアップデートでは以下の新機能がサポートされました:

  • ノートのピン (pin notes to the top)
  • 畳まれた親ノートブックで子ノートも表示
  • ワークスペース・ビュー
  • 各ビューにおけるソート順序の記憶
  • ナビゲーション・ステートの記憶

以下で詳しくご説明します。

ノートのピン

Inkdropにて、どのノートで作業していたか覚えておくのに苦労する事が時々あるでしょう。 “Pin to Top”機能は、特定のノートをノート一覧の上部に据え付ける事ができます:

畳まれた親ノートブックで子ノートも表示

v5以前では、選択したノートブックは基本的にその直下にあるノートしか一覧表示しませんでした。沢山の子/孫ノートブックがある場合、そのプロジェクトの中身を縦断的に素早く把握したくても出来ませんでした。Inkdrop v5では選択ノートブックがサイドバー上で畳まれた状態の時、その子ノートも一覧に含むようになりました。以下をご覧ください:

サイドバーのノートブック右に表示されているノート数表示も、畳む/展開の状態に応じて変化していることに注目してください。

ワークスペース・ビュー

デフォルトでは、サイドバーにはデータベース内の全てのノートブック、ステータスとタグが表示されています。それらは一緒くたになっていて、どのプロジェクトに関する情報か見分けるのが難しい状態です。今作業しているプロジェクトに関する情報だけを表示したいという事があるでしょう。ワークスペース・ビューはサイドバーの情報を特定のノートブックに絞り込む事ができます:

各ビューにおけるソート順序の記憶

各ビュー(all/notebook/tag/status)において、ソート順序の設定が記憶されるようになりました。これでいちいちノートブック間でソート設定を切り替える必要がなくなりました。

ナビゲーション・ステートの記憶

ノートを書いている最中、他のノートを参照することが多々あるかもしれません。なので、ノートテイキングにおいてノートの検索から素早く編集していたノートに戻れる機能は重要です。以下のデモをご覧ください:

プラグイン管理GUI

プラグインはipm コマンドからインストール出来ましたが、いちいちターミナルを開いてコマンドを実行する必要があり、あまり手軽とは言えませんでした。一部のユーザさんはこのコマンドの取り扱いに混乱している様子でした。100個以上のプラグインがある今、簡単にプラグインをインストール・アンインストール出来ることは重要です。そこで、v5ではプラグイン管理のGUIを実装しました。ターミナルを開くこと無く、プラグインを追加・削除できます:

オートアップデートにも対応したので、 ipm update を実行する必要も無くなりました:

..and many more!

他にも沢山の改善やバグ修正があります。全て列挙するととても長くなってしまうので、詳しくはリリース・ノートをご覧ください。

Read more

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
ノート駆動AIコーディング術の提案

ノート駆動AIコーディング術の提案

どうもTAKUYAです。みなさんはAIエージェントを普段のコーディングで活用されていますか。ちょっと面白いワークフローを思いついたのでシェアします。それは、ノート駆動のエージェンティック・コーディング・ワークフローです。最近Claude Codeのプランモードを使っていたら、ターミナル内で生成されたプランを読むのが辛かったんです。それで、じゃあMarkdownノートアプリであるInkdropをプランの保存先バックエンドとして使えば解決するんじゃないかと思って、 試してみました。こちらがそのデモです(英語): こちらがClaude Codeの設定ファイル群です: GitHub - inkdropapp/note-driven-agentic-coding-workflow at devas.lifeComplete Claude Code configuration collection - agents, skills, hooks, commands, rules, MCPs. Battle-tested configs from an Anthropic hackathon w

By Takuya Matsuyama
2025年個人開発活動の振り返り

2025年個人開発活動の振り返り

どうもTAKUYAです。もう1月も半ばに差し掛かっているけど、2025年の自分の活動の振り返りをしたい。去年を一言で言うなら、本厄を満喫した年だった。 厄年とは、人生の節目にあたって、体調不良や災難が起こりやすいと経験的に言われる年齢のこと。数え年で42歳、確かにもう若さに任せた事は出来ないなと痛感した年だった。(ところであなたの国ではこのような年はありますか?) 夏に体調を崩して2~3ヶ月動けなくなった 暖かくなり花粉が飛び出した頃に、持病のアトピーが悪化しだして、まともに生活出来なくなってしまった。酷さで言うと、2019年に脱ステした時と同じぐらい。 脱ステに無事成功したから、この地獄は二度と味わうことはないだろうと高を括っていたが、まさか7年後にまた味わうとは思わなかった。当時の独身時代と違い、妻も子供もいる中で、周りに多大な迷惑をかける事となった。夏の子供との思い出が全く無い。悲しい。 現在はQoLもほとんど元の状態まで復活できた。写真を撮って症状の変化を記録したので、機会があればシェアしたい。食事療法など色々試したが、結局歩くのが一番自分に効いた。それ以来、一日一万歩

By Takuya Matsuyama