メモを書くだけなら、ブラウザで動くアプリで十分です。ただ、起動してすぐ書けること、入力が重くならないことを考えると、もっと小さいアプリにしたくなりました。
CotEditorのような軽さを目指すなら、WebViewを使わない方が気持ちよさそうです。というわけで、RustとSlintでローカルなMarkdownメモアプリを作り始めました。
Rust側に寄せる
今回はRustとSlintで作ることにしました。ReactやNode.jsを使わず、UI、状態管理、永続化をRust側に集めます。
SlintのUIファイルはビルドスクリプトでRustコードに変換されます。
Webのアプリと同じように作り始めると、結局ブラウザ上の状態とネイティブ側の状態をつなぐ処理が増えます。それなら最初から、ローカルアプリとして必要な範囲に絞った方がよさそうでした。
まず必要なものを入れる
メモの作成、編集、削除、ピン留めを入れました。本文を含む横断検索、フォルダ分類、最近編集したメモの絞り込みもあります。
Markdownは分割表示とプレビューを切り替えます。
保存は入力のたびに毎回ファイルへ書くのではなく、700msほど待って自動保存するようにしました。ここは、最初に入力のたびに保存しようとして、なんかもたつく、ってなったのでデバウンスに落ち着きました。
ローカルのJSONへ永続化するだけなので、最初の段階ではデータベースもいりません。アプリを閉じてもメモが残るところまで動けば、とりあえず使い始められます。
AIは後から足す
AIメモ整理の案も考えています。タイトルや要約、タグ、次にやることを提案してくれると便利そうです。
ただ、最初からAI APIを中心にすると、メモを書く部分の使い勝手が分からなくなります。まずはローカルで書く、探す、保存する流れを作って、その後にAIアシストを足す順番にしました。
モデルIDは最初から固定しています。比較や検証をする時に、設定画面から別モデルを自由に選べるようにすると、何を比べたのか分かりにくくなるためです。
まだエディタにはなっていない
次にやりたいのは、macOSのネイティブなopen/saveダイアログ、タグ、全文検索インデックス、AIアシストAPIです。
今はアプリ内部のJSONに保存しているので、既存のMarkdownファイルを直接開く機能はまだありません。このままでは、Markdownメモアプリというより、Markdownを表示できるローカルメモ帳です。自分でも分かっています。
でも、先に操作感を作ってからファイル連携を足す方が、何を改善したいのか見えやすそうです。
おわり
WebViewを使わないと決めたことで、使えるライブラリや作り方は狭くなりました。その代わり、UIと保存の流れを同じ側で追えるので、今の小さい段階では分かりやすいです。
AIを使う部分も、メモアプリの中心ではなく、あとから追加できる補助機能として置けそうです。
まずは、起動してすぐ書けることと、保存で不安にならないことを優先します。Slintの使い心地がよければ、open/saveダイアログから入れていきます。とりあえず、毎日使ってみて、足りないところを探す段階です。